Почему для чтения текстовых файлов используется абсолютный путь C #, а путь изменится - PullRequest
0 голосов
/ 14 июля 2020

Я использую unity3d и vs2019 для чтения текстового файла (txt) следующим образом:

    public class MeshTest01 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        string filePath = @"‪‪‪D:\Desktop\Unity\Mesh\77.txt";
        string[] lines = File.ReadAllLines(filePath);
        foreach (var item in lines)
        {
            Debug.Log(item);
        }
        //List<string> planesStr = TxtOperation.GetFaces2str(linesStr);
        //Debug.Log(TxtOperation.GetFaceIndex(planesStr[0]));

    }
}

Информация об ошибке выглядит следующим образом:

DirectoryNotFoundException: Could not find a part of the path "E:\project\GitHub\RobotSimulation\***D:\Desktop\Unity\Mesh\77.txt".

Почему появляется предыдущая часть пути к файлу

1 Ответ

0 голосов
/ 14 июля 2020

Честно говоря, я не могу объяснить, почему это происходит.

Обычно да, это может быть один из способов чтения внешнего файла.

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

Однако, как правило, я бы сохранил файлы вместе с проектом, которому они принадлежат, и поместил их

  • либо в Application.streamingAssetsPath в редакторе в папка Assets/StreamingAssets для файлов, которые должны быть

    • доступными для чтения / записи для редактора
    • , но только для чтения позже в сборке
  • или Application.persistentDataPath для сборок, если вы хотите

    • писать им с помощью кода
    • или позволить пользователю впоследствии измените содержимое извне

Тогда вы получите свой путь, используя

var path = Path.Combine(Application.streamingAssetsPath, "SomeFolder", "77.txt");

или, соответственно,

var path = Path.Combine(Application.persistentDataPath, "SomeFolder", "77.txt");

Для потоковых ресурсов есть несколько особых случаев (например, на Android), когда вам нужно прочитать файл, используя UnityWebRequest.Get, поскольку он сжимается.

В качестве альтернативы, если это вариант для вас, вы также можете напрямую перетащить его в Assets (или любую другую папку ниже, кроме специальных, таких как StreamingAssets, Resources et c), а затем напрямую перетащить его в папку поле через Инспектор, используя его как (только для чтения) TextAsset

[SerializeField] private TextAsset meshFile;

, а затем доступ к его содержимому через

var lines = meshFile.text.Split('/n');

Также я обобщаю: вы должны сделать огромный круг вокруг Resources!

Сами Unity настоятельно рекомендуют не использовать его! Это и причины можно найти в Лучшие практики .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...