2016-07-03 16 views
8

Come gestire il nome file nelle classi System.IO in modo multipiattaforma per farlo funzionare su Windows e Linux?Gestione nomi file multipiattaforma in .NET Core

Per esempio, ho scrivere questo codice che funziona perfettamente su Windows, ma non crea un file su Ubuntu Linux:

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

risposta

12

di Windows usando una barra inversa. Linux usando Slash. Path.Combine imposta il simbolo giusto:
Path.Combine Method - MSDN

+0

Esiste un tipo di conversione automatica del percorso simile a Qt che utilizza esclusivamente la barra e li converte in backslash su Windows? – Rem

+1

@Rem Hai bisogno di convertirli? Windows generalmente supporta anche le barre. – svick

+0

Come dice svick, le barre possono essere utilizzate come separatori di percorso su Windows (solo command.com e cmd.exe interpretano le barre come qualcos'altro) @Rem –

2

È possibile utilizzare semplicemente le barre. percorsi relativi funzionano in modo identico, e percorsi assoluti possono essere solo relativo alla radice dell'unità principale (come percorsi assoluti iniziano con "c" non sono portatili)

7

È anche possibile utilizzare Path.DirectorySeparatorChar come di seguito:

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

Riferimento: MSDN

0

Il post originale è più di un anno ma ho ancora imbattuto in questo problema. Mi sembra che anche l'uso dei punti nei percorsi relativi sia un problema.

Un percorso come

".\\input\\mydata.csv" 

ha funzionato bene su Windows ma non su UNIX. Quando si cambia il dot-notazione per directory corrente:

Path.GetFullPath(Directory.GetCurrentDirectory()) 

ho avuto più successo.