web-dev-qa-db-fra.com

Quelle est la meilleure façon de combiner un chemin et un nom de fichier en C # /. NET?

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?

61
Rasmus Faber

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));
98
LukeH

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("/","\\")))
17
GvS

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 ...

2
Ravi