Подтвердить что ты не робот

Кросс-платформенная обработка имен файлов в .NET Core

Как обрабатывать имя файла в классах System.IO кросс-платформенным способом, чтобы заставить его работать в Windows и Linux?

Например, я пишу этот код, который отлично работает в Windows, однако он не создает файл на Ubuntu Linux:

var tempFilename = [email protected]"..\Data\uploads\{filename}";
using (FileStream fs = System.IO.File.Create(tempFilename))
{
    file.CopyTo(fs);
    fs.Flush();                    
}
4b9b3361

Ответ 1

Windows с использованием обратного слэша. Linux с использованием Slash. Путь. Комбинация задает правильный символ:
Метод Path.Combine - MSDN

Ответ 2

Вы также можете использовать Path.DirectorySeparatorChar, как показано ниже:

 Console.WriteLine("..{0}Data{0}uploads{0}{{filename}}", Path.DirectorySeparatorChar);

Ссылка: MSDN

Ответ 3

Вы можете просто использовать косые черты. Относительные пути будут работать одинаково, а абсолютные пути могут быть только относительно корня основного диска (поскольку абсолютные пути, начинающиеся с "c:", не переносимы)

Ответ 4

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

Путь, подобный

".\\input\\mydata.csv" 

хорошо работал на окнах, но не на unix. При изменении точечной нотации для текущего каталога на:

Path.GetFullPath(Directory.GetCurrentDirectory())

У меня был больше успеха.

Ответ 5

Много хороших ответов. Я просто хотел бы добавить, что можно избежать необходимости указывать чат-разделитель каталогов с помощью Path.Combine

Пример с файлом, расположенным относительно ".\..\toto\app.config":

Path.Combine("..", "toto", "app.config");

К сожалению, Path.Combine не разрешает относительный путь к абсолютному пути в .Net Core. Можно использовать Uri, чтобы получить это:

Path.GetFullPath(Path.Combine("..", "toto", "app.config"))