Чтение и запись в текстовый файл с устройства iOS - PullRequest
0 голосов
/ 05 марта 2020

С моего iPad я пытаюсь сохранить данные в текстовый файл и прочитать их. Строка из текстового файла будет отображаться в текстовом поле. На моем MA C все работает нормально, но если я попробую его на своем iPad, я всегда получаю следующую ошибку:

DirectoryNotFoundException: не удается найти часть пути

Это код, который я использую:

Text txtField

public void SaveDataToTextFile()
{
    using(StreamWriter saveData = new StreamWriter(Application.dataPath + "/Resources/TextFiles/textfile.txt"))
    {
        saveData.Write("Some Text");
        saveDate.Close();

        ReadSavedData();
    }
    // I also tried it with Application.persistenDataPath and Application.StreamingAssets
    // But with both solutions I received the error above
}

public void ReadSavedData()
{
    using(StreamReader readData = new StreamReader(Application.dataPath + "Resources/TextFiles/textfile.txt"))
    {
        var fileContent = savedData.ReadToEnd();
        var lines = fileContent.Split(new char[] { '\n' });

        foreach(var line in lines)
        {
            var savedDataString = line.Split(new char[] { '\n' });
            txtField.text = string.Join("\n", savedDataString.Skip(1));
        }
    }
}

Я знаю, этот вопрос похож на этот вопрос и даже на этот , но на самом деле ни один из них помог мне.

Что мне нужно изменить, чтобы мой iPad мог писать и читать из текстового файла?

Редактировать

Мне удалось прочитать мой текстовый файл с моим iPad со следующим кодом:

public void ReadSavedData()
{
    // Read dueDates TextFile:
    var textFile = Resources.Load<TextAsset>("TextFilePath/textFileName");
    var lines = textFile.text.Split(new char[] { '\n' });

    foreach(var line in lines)
    {
        var savedDataString = line.Split(new char[] { '\n' });
        txtField.text = string.Join("\n", savedDataString.Skip(1));
    }
}

Но я все еще не могу записать в свой текстовый файл.

1 Ответ

1 голос
/ 06 марта 2020

Никогда использовать простую конкатенацию строк для системных путей!

И обратите внимание, что особенно

Application.dataPath + "Resources/TextFiles/textfile.txt"

без какого-либо разделителя не имеет смысла, поскольку это будет файл вне папки

Application.persistentDataPath

, так как это приведет к чему-то вроде

/rootfolder/applicationfolderResources/TextFiles/textfile.txt

Вам нужен либо \, либо / между ними, например,

/rootfolder/applicationfolder/Resources/TextFiles/textfile.txt

Поэтому лучше использовать Path.Combine, который использует правильные разделители пути в соответствии с работающей ОС.

Path.Combine(Application.persistentDataPath, "Resources", "TextFiles", "textfile.txt")

Затем дополнительно специальное примечание относительно Resources:

Из собственных рекомендаций Unity для Resources папка

Не используйте!

Существует множество причин, по которым вы все можете найти в ссылка, но самое главное для вашего случая: папка dataPath и Resources только для чтения после сборки!

Так что да, вы можете использовать это для загрузки материала, если вы действительно настаиваете, но только с использованием Resources.Load, а не напрямую через путь к файлу, как вы уже поняли - , но вы не сможете написать В любом случае, перейдите к нему.

Вместо этого используйте Application.persistentDataPath, например, например

Path.Combine(Application.persistentDataPath, "TextFiles", "textFile.txt")

, чтобы сохранить этот файл на устройстве - видимый для пользователя, хотя вы Возможно, вы захотите использовать какое-то шифрование.


Тогда все еще возможно / вероятно, что папка TextFiles просто на самом деле еще не существует. Так что создай это. Я также хотел бы от go до File.Open, что немного более безопасно (например, создать файл, если он не существует и т. Д. c)

private string folderPath => Path.Combine(Application.persistentDataPath, "TextFiles");
private string filePath => Path.Combine(folderPath, "textFile.txt");

public void SaveDataToTextFile()
{
    if(!Directory.Exists(folderPath)
    {
        Directory.CreateDirectory(folderPath);
    }

    if(File.Exists(filePath))
    {
        File.Delete(filePath);
    }

    using(var fs = File.Open(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write))
    {
        using(war writer = new StreamWriter(fs))
        {
            writer.Write("Some Text");
        }
    }

    ReadSavedData();
}

И

public void ReadSavedData()
{
    if(!File.Exists(filePath)) return;

    using(var fs = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        using(var reader = new StreamReader(fs))
        {
            var fileContent = savedData.ReadToEnd();
            var lines = fileContent.Split(new char[] { '\n' });

            foreach(var line in lines)
            {
                var savedDataString = line.Split(new char[] { '\n' });
                txtField.text = string.Join("\n", savedDataString.Skip(1));
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...