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();
}
Windows utilisant Backslash. Linux utilisant Slash. Path.Combine a défini le bon symbole:
Méthode Path.Combine - MSDN
Vous pouvez également utiliser Path.DirectorySeparatorChar comme ci-dessous:
Console.WriteLine("..{0}Data{0}uploads{0}{{filename}}", Path.DirectorySeparatorChar);
Référence: MSDN
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)
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"))
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.