подчеркивание в окружении обратной косой черты - PullRequest
0 голосов
/ 28 февраля 2019

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

Я написалследующее, которое, я считаю, должно работать:

string tempPath = Path.Combine(Application.dataPath, "MyValues");
tempPath = Path.Combine(tempPath, "_");
tempPath = Path.Combine(tempPath, counter.ToString() + ".csv");

После того, как я заметил, что на самом деле ни один файл не был сохранен, я включил Debug.Log(tempPath), чтобы увидеть, что он возвращает, и неожиданно получаю следующее:

MyUnityProject/Assets\MyValues\_\0.csv

Во-первых, почему \ вместо /?

Кроме того, откуда берутся обратные слеши, окружающие подчеркивание?

Наконец, вместо того, чтобы удалять их вручную, как можноЯ вернул правильный синтаксис?Например MyValues_0.csv, MyValues_1.csv и т. Д. *

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Используется ли \ или / для построения правильного пути - это единственная причина почему вы вообще используете Path.Combine:

  • Он использует все, что понимает текущая Plattform / OS, для объединения двух строк в путь и тем самым делает платформу независимой.
  • Также добавлены некоторые дополнительные проверки, являются ли предоставленные строки допустимыми фрагментами пути, и, следовательно, делает его также более безопасным в использовании, чем простая конкатенация.

Что вы делаете

string tempPath = Path.Combine(Application.dataPath, "MyValues");
tempPath = Path.Combine(tempPath, "_");
tempPath = Path.Combine(tempPath, counter.ToString() + ".csv");

Предполагается, что MyValue и _ являются именами папок.

Используйте Path.Combine только для объединения папок и окончательного имени файла не для объединения самого имени файла.


Вместо этого вы хотите создать полное имя файла путем конкатенации строк, например, используя string.Format

string filename = string.Format("MyValues_{0}.csv", counter.ToString());

или также $ (интерполяция строк)

string filename = $"MyValues_{counter.ToString()}.csv";

, которые являются просто более сложными способами записи

string filename = "MyValues_" + counter.ToString() + ".csv";

, а затем используют Path.Combine только для объединения полногоимя файла с указанным путем к системной папке, например

string tempPath = Path.Combine(Application.dataPath, filename);
0 голосов
/ 28 февраля 2019

Посмотрев на исходный код класса Path, доступного здесь: https://referencesource.microsoft.com/#mscorlib/system/io/path.cs,16ed6da326ce4745

Мы видим, что метод Combine вызывает метод CombineNoChecks для каждой пары строковых путей и возвращаетследующее:

return path1 + DirectorySeparatorCharAsString + path2;

Значение DirectorySeparatorCharAsString равно:

internal const string DirectorySeparatorCharAsString = "\\";

В классе определены и другие разделители, поэтому вы получаете правильный раздел в зависимости от используемой платформы:

// Platform specific alternate directory separator character.  
// This is backslash ('\') on Unix, and slash ('/') on Windows 
// and MacOS.
public static readonly char AltDirectorySeparatorChar = '/';

Так что я не буду беспокоиться о том, что возвращает метод, он должен просто работать.

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