Ошибка: DirectoryNotFoundException: Could not find a part...

Программирование на Юнити.

Ошибка: DirectoryNotFoundException: Could not find a part...

Сообщение Некий Новичок 10 янв 2021, 12:33

Всем привет! Решил реализовать сохранение в Unity через текстовый файл (версия 2019.4.8f1), в результате столкнулся с ошибкой: DirectoryNotFoundException: Could not find a part of the path "C:\Users\popov\SkyF\Assets\StreamingAssets\CurrentMapAndLevel.txt". SkyF - имя проекта, StreamingAssets - папка, созданная вручную, CurrentMapAndLevel.txt - сам файл.
Как работает система: Есть FileChecker, который проверяет, создан ли файл. В противном случае мы получаем исключение, обрабатывая который мы создаем файл и записываем основные данные:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEngine.UI;

public class FileChecker : MonoBehaviour
{
    public static string path = Application.dataPath + "/";
    public static string nameFile = "CurrentMapAndLevel.txt";

    public static void IsFileCreated()
    {
        try
        {
            StreamReader sr = new StreamReader(path + "/" + nameFile);
        }
        catch
        {
            File.Create(path + "/" + nameFile);
            StreamWriter writer = new StreamWriter(path + "/" + nameFile);
            writer.Write("1-1");
            writer.Close();
        }
    }
}

С помощью FileReader я пытаюсь получить данные:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System;

public class FileReader : MonoBehaviour
{
    public static string path = Application.dataPath + "/StreamingAssets";
    public static string nameFile = "CurrentMapAndLevel.txt";
    public static string LevelInfo = "";

    public static (byte, byte) GetLevel()
    {
        StreamReader sr = new StreamReader(path + "/" + nameFile);
        LevelInfo = sr.ReadLine();
        sr.Close();
        char[] array = LevelInfo.ToCharArray();
        return (Convert.ToByte(array[0].ToString()), Convert.ToByte(array[2].ToString())); //returns: current map, current level
    }
}

Буду очень благодарен, если поможете :)
P.S. Если создать файл вручную (вписав значение) все работает...
Последний раз редактировалось Некий Новичок 10 янв 2021, 12:44, всего редактировалось 1 раз.
Некий Новичок
UNец
 
Сообщения: 6
Зарегистрирован: 10 янв 2021, 11:43

Re: Ошибка: DirectoryNotFoundException: Could not find a part...

Сообщение Jarico 10 янв 2021, 12:44

Синтаксис:
Используется csharp
        string path = Path.Combine(Application.dataPath, "StreamingAssets", "CurrentMapAndLevel.txt");
        if (File.Exists(path))//есть файл?
        {

        }
        else//нет файла
        {

        }
 
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Ошибка: DirectoryNotFoundException: Could not find a part...

Сообщение Некий Новичок 10 янв 2021, 13:12

Jarico писал(а):
Синтаксис:
Используется csharp
        string path = Path.Combine(Application.dataPath, "StreamingAssets", "CurrentMapAndLevel.txt");
        if (File.Exists(path))//есть файл?
        {

        }
        else//нет файла
        {

        }
 

Не получилось. Точнее файл создается, а записи нет. Ошибка: IOException: Sharing violation on path C:\Users\popov\SkyF\Assets\StreamingAssets\CurrentMapAndLevel.txt
Извиняюсь, если допущена тупейшая ошибка...
Синтаксис:
Используется csharp
    public static string path = Path.Combine(Application.dataPath, "StreamingAssets", "CurrentMapAndLevel.txt");
    public static string nameFile = "CurrentMapAndLevel.txt";

    public static void IsFileCreated()
    {
        if (File.Exists(path))
        {
            StreamReader sr = new StreamReader(path);
            if(sr.ReadLine() == null)
            {
                StreamWriter writer = new StreamWriter(path, false);
                writer.WriteLine("1-1");
                writer.Close();
            }
        }
        else
        {
            File.Create(path);
            StreamWriter writer = new StreamWriter(path, false);
            writer.WriteLine("1-1");
            writer.Close();
        }
    }
Некий Новичок
UNец
 
Сообщения: 6
Зарегистрирован: 10 янв 2021, 11:43

Re: Ошибка: DirectoryNotFoundException: Could not find a part...

Сообщение Jarico 10 янв 2021, 13:41

Что ты хочешь сделать?
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Ошибка: DirectoryNotFoundException: Could not find a part...

Сообщение Некий Новичок 10 янв 2021, 13:47

Jarico писал(а):Что ты хочешь сделать?

Запись в файл значения по умолчанию (если его только что создали) или получить его данные (проверка значения, чтобы не было null)
Некий Новичок
UNец
 
Сообщения: 6
Зарегистрирован: 10 янв 2021, 11:43

Re: Ошибка: DirectoryNotFoundException: Could not find a part...

Сообщение Alkos26Rus 10 янв 2021, 15:49

Попробуй использовать File.Create(path).Dispose();

Синтаксис:
Используется csharp
    public static string path = Path.Combine(Application.dataPath, "StreamingAssets", "CurrentMapAndLevel.txt");
    public static string nameFile = "CurrentMapAndLevel.txt";

    public static void IsFileCreated()
    {
        if (File.Exists(path))
        {
            StreamReader sr = new StreamReader(path);
            if(sr.ReadLine() == null)
            {
                StreamWriter writer = new StreamWriter(path, false);
                writer.WriteLine("1-1");
                writer.Close();
            }
        }
        else
        {
            File.Create(path).Dispose();
            StreamWriter writer = new StreamWriter(path, false);
            writer.WriteLine("1-1");
            writer.Close();
        }
    }
 
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Ошибка: DirectoryNotFoundException: Could not find a part...

Сообщение Некий Новичок 10 янв 2021, 16:35

Alkos26Rus писал(а):Попробуй использовать File.Create(path).Dispose();

Синтаксис:
Используется csharp
    public static string path = Path.Combine(Application.dataPath, "StreamingAssets", "CurrentMapAndLevel.txt");
    public static string nameFile = "CurrentMapAndLevel.txt";

    public static void IsFileCreated()
    {
        if (File.Exists(path))
        {
            StreamReader sr = new StreamReader(path);
            if(sr.ReadLine() == null)
            {
                StreamWriter writer = new StreamWriter(path, false);
                writer.WriteLine("1-1");
                writer.Close();
            }
        }
        else
        {
            File.Create(path).Dispose();
            StreamWriter writer = new StreamWriter(path, false);
            writer.WriteLine("1-1");
            writer.Close();
        }
    }
 

Не помогло :(
Некий Новичок
UNец
 
Сообщения: 6
Зарегистрирован: 10 янв 2021, 11:43

Re: Ошибка: DirectoryNotFoundException: Could not find a part...

Сообщение samana 10 янв 2021, 16:50

Может причина в целевой платформе? Например в документации сказано, что для андроида или веб нужно загружать файлы через www
https://docs.unity3d.com/ru/530/ScriptR ... sPath.html
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Ошибка: DirectoryNotFoundException: Could not find a part...

Сообщение 1max1 10 янв 2021, 16:59

Что там вообще в path? Выведи в лог, там скорей всего слеши разные \ /
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Ошибка: DirectoryNotFoundException: Could not find a part...

Сообщение Некий Новичок 10 янв 2021, 17:26

Пишу решение (может кому-то поможет). Этот способ работает на пк! В основном пути указываем пустоту (то есть "", без пробелов и каких-либо знаков). Дальше путь указывается таким способом: ""/Имя файла или папки. Если ничего не поняли, смотрите код:
Синтаксис:
Используется csharp
    public static string path = "";
    public static string nameFile = "CurrentMapAndLevel.txt";

    public static void IsFileCreated()
    {
        if (File.Exists(nameFile))//есть файл?
        {
            StreamReader sr = new StreamReader(nameFile); //создаем новый файл, сразу с возможностью записи или открываем на чтение (если существует)
            if(sr.ReadLine() == null)//если в файле пусто
            {
                StreamWriter writer = new StreamWriter(nameFile, false); //создаем новый файл, сразу с возможностью записи или открываем на чтение (если существует)
                writer.WriteLine("1-1"); //записываем построчно (то есть в конец записанных данных добавляется символ строки)
                writer.Close(); //закрываем файл, тем самым освобождая ресурсы и записывая данные
            }
        }
        else//нет файла
        {
            StreamWriter writer = new StreamWriter(nameFile, false); //создаем новый файл, сразу с возможностью записи или открываем на чтение (если существует)
            writer.WriteLine("1-1"); //записываем построчно (то есть в конец записанных данных добавляется символ строки)
            writer.Close(); //закрываем файл, тем самым освобождая ресурсы и записывая данные
        }
    }
 


Синтаксис:
Используется csharp
"CurrentMapAndLevel.txt" //обращаемся к файлу (CurrentMapAndLevel.txt) через корень проекта (указан по умолчанию)
"Folder\\CurrentMapAndLevel.txt" //обращаемся к файлу (CurrentMapAndLevel.txt) через корень проекта -> папку (Folder)
 

Также никто не запрещает писать путь в одну строку (как я сделал в примере выше).
Чтобы обращаться к папкам используем "\\"! Если написать "\" - вылезет ошибка, поскольку это экранирующий символ!
P.S. Огромная благодарность всем тем, кто пытался помочь. Благодаря вам я избежал множество ошибок в проекте :-bd
Некий Новичок
UNец
 
Сообщения: 6
Зарегистрирован: 10 янв 2021, 11:43

Re: Ошибка: DirectoryNotFoundException: Could not find a part...

Сообщение Некий Новичок 10 янв 2021, 18:16

1max1 писал(а):Что там вообще в path? Выведи в лог, там скорей всего слеши разные \ /

Верно пометил! Спасибо огромное за помощь!
Некий Новичок
UNец
 
Сообщения: 6
Зарегистрирован: 10 янв 2021, 11:43


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9