web-dev-qa-db-fra.com

Gestion des noms de fichiers multiplateforme dans .NET Core

Comment gérer le nom de fichier dans System.IO des classes multiplateformes pour le faire fonctionner sur Windows et Linux?

Par exemple, j'écris ce code qui fonctionne parfaitement sous Windows, mais il ne crée pas de fichier sur Ubuntu Linux:

var tempFilename = $@"..\Data\uploads\{filename}";
using (FileStream fs = System.IO.File.Create(tempFilename))
{
    file.CopyTo(fs);
    fs.Flush();                    
}
21
Rem

Windows utilisant Backslash. Linux utilisant Slash. Path.Combine a défini le bon symbole:
Méthode Path.Combine - MSDN

26
user6522773

Vous pouvez également utiliser Path.DirectorySeparatorChar comme ci-dessous:

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

Référence: MSDN

32

Vous pouvez simplement utiliser des barres obliques. Les chemins relatifs fonctionneront de manière identique et les chemins absolus ne peuvent être relatifs qu'à la racine du lecteur principal (car les chemins absolus commençant par "c:" ne sont pas portables)

4
Paul Stelian

Beaucoup de bonnes réponses. Je voudrais juste ajouter que l'on peut éviter d'avoir à spécifier le chat de séparation de répertoire en utilisant Path.Combine

Exemple avec le fichier situé relativement à ".\..\toto\app.config":

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

Malheureusement, Path.Combine ne résout pas un chemin relatif vers un chemin absolu dans .Net Core. Path.GetFullPath est là pour ça:

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

Le message d'origine remonte à plus d'un an, mais j'ai quand même rencontré ce problème. Il me semble que l'utilisation de points dans les chemins relatifs est également un problème.

Un chemin comme

".\\input\\mydata.csv" 

fonctionnait bien sur windows mais pas sur unix. Lorsque vous changez la notation par points du répertoire actuel en:

Path.GetFullPath(Directory.GetCurrentDirectory())

J'ai eu plus de succès.

1
user3042674