Quelle est la meilleure façon de combiner un chemin avec un nom de fichier?
Autrement dit, étant donné c:\foo
Et bar.txt
, Je veux c:\foo\bar.txt
.
Étant donné c:\foo
Et ..\bar.txt
, Je veux soit une erreur soit c:\foo\bar.txt
(Donc je ne peux pas utiliser Path.Combine()
directement). De même pour c:\foo
Et bar/baz.txt
, Je veux une erreur ou c:\foo\baz.txt
(Pas c:\foo\bar\baz.txt
).
Je me rends compte, je pourrais vérifier que le nom de fichier ne contient pas '\' ou '/', mais est-ce suffisant? Sinon, quelle est la bonne vérification?
Si vous voulez que les "mauvais" noms de fichiers génèrent une erreur:
if (Path.GetFileName(fileName) != fileName)
{
throw new Exception("'fileName' is invalid!");
}
string combined = Path.Combine(dir, fileName);
Ou, si vous voulez simplement corriger silencieusement les "mauvais" noms de fichiers sans lever d'exception:
string combined = Path.Combine(dir, Path.GetFileName(fileName));
Vous pouvez utiliser:
Path.Combine(folder, Path.GetFileName(fileName))
ou, pour ignorer le\(non testé, peut-être que Path.GetFileName le gère automatiquement)
Path.Combine(folder, Path.GetFileName(fileName.Replace("/","\\")))
Sachez que lorsque vous utilisez Path.Combine(arg1, arg2)
- si votre utilisateur entre un chemin de fichier complet pour arg2, il ignorera arg1 et utilisera arg2 comme chemin.
À mon avis, Microsoft a foiré là-haut! Cela peut vous laisser grand ouvert avec l'utilisateur piratant l'ensemble de votre système de fichiers. Soyez averti, lisez les petits caractères! Si vous combinez des chemins, utilisez: var newPath = path1 + @"\" + path2;
des résultats plus simples et inattendus ...