2016-07-03 15 views
8

Jak obsługiwać nazwy plików w klasach System.IO w sposób międzyplatformowy, aby działał w systemach Windows i Linux?Obsługa nazw wielu platform w .NET Core

Na przykład piszę ten kod, który działa doskonale na Windows, jednak nie tworzy plik na Ubuntu Linux:

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

Odpowiedz

12

Windows za pomocą backslash. Linux używa Slasha. Path.Combine ustaw odpowiedni symbol:
Path.Combine Method - MSDN

+0

Czy istnieje jakaś automatyczna konwersja ścieżki podobna do Qt, która używa wyłącznie slash i konwertuje je na ukośnik w oknach? – Rem

+1

@Rem Czy chcesz je przekonwertować? System Windows zazwyczaj obsługuje również ukośniki. – svick

+0

Jak svick mówi, ukośniki mogą być używane jako separatory ścieżek w systemie Windows (tylko command.com i cmd.exe interpretują ukośniki jako coś innego) @Rem –

2

Możesz po prostu użyć ukośników. Ścieżki względne będzie działać identycznie, a ścieżki bezwzględne może być tylko w stosunku do katalogu głównego napędu głównego (jak ścieżki bezwzględne zaczynające się od „c:” nie są przenośne)

7

Można również użyć Path.DirectorySeparatorChar jak poniżej:

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

referencyjny: MSDN

0

Oryginalny post jest ponad rok, ale nadal prowadził w tej sprawie. Wydaje mi się, że problemem jest również używanie kropek w ścieżkach względnych.

Ścieżka jak

".\\input\\mydata.csv" 

działa dobrze na oknach, ale nie w systemie UNIX. Przy zmianie dot-notację dla bieżącego katalogu do:

Path.GetFullPath(Directory.GetCurrentDirectory()) 

miałem więcej sukcesów.