2009-06-26 8 views
49

Jaki jest najlepszy sposób łączenia ścieżki z nazwą pliku?Jaki jest najlepszy sposób na połączenie ścieżki i nazwy pliku w C#/.NET?

To znaczy, biorąc pod uwagę c:\foo i bar.txt, chcę c:\foo\bar.txt.

Biorąc pod uwagę c:\foo i ..\bar.txt, chcę albo błąd lub c:\foo\bar.txt (więc nie mogę bezpośrednio użyć Path.Combine()). Podobnie dla c:\foo i bar/baz.txt, chcę błąd lub c:\foo\baz.txt (nie c:\foo\bar\baz.txt).

Zdaję sobie sprawę, że mogę sprawdzić, czy nazwa pliku nie zawiera "\" lub "/", ale czy to wystarczy? Jeśli nie, jaka jest prawidłowa kontrola?

Odpowiedz

83

Jeśli chcesz "złe" nazwy plików do wygenerować błąd:

if (Path.GetFileName(fileName) != fileName) 
{ 
    throw new Exception("'fileName' is invalid!"); 
} 
string combined = Path.Combine(dir, fileName); 

Lub, jeśli chcesz po prostu poprawić "złe" nazwy plików bez wyrzucania wyjątek:

string combined = Path.Combine(dir, Path.GetFileName(fileName)); 
+9

Dla osób mniej zaznajomionych z framework, potrzebujesz wywołania 'using System.IO;' w twoim pliku, aby uzyskać dostęp do 'Path'. –

+2

Zauważ, że 'Path.Combine' rzuci' ArgumentNullException', jeśli którykolwiek z jego argumentów ma wartość 'null'. Ty ** możesz ** przekazać pusty ciąg do argumentu –

+2

Uwaga: Path.Combine zwykle dodaje separator między każdą ścieżką, jeśli jest to konieczne. Jednak Path.Combine ("C:", "file.txt") zwraca "C: file.txt", co nie jest prawidłową ścieżką. – ConditionRacer

16

Można użyć:

Path.Combine(folder, Path.GetFileName(fileName)) 

lub, aby przejść na zewnątrz \ (nie testowane, może Path.GetFileName obsługuje to automatycznie)

Path.Combine(folder, Path.GetFileName(fileName.Replace("/","\\"))) 
+4

Dzięki! Tylko dla FYI: Wymienić nie jest konieczne. –

1

Należy pamiętać, że podczas korzystania Path.Combine(arg1, arg2) - jeśli użytkownik wprowadza pełną ścieżkę pliku dla arg2 będzie lekceważyć ARG1 i używać arg2 jako ścieżki.

Moim zdaniem Microsoft spieprzył tam! Dzięki temu możesz hakować cały twój system plików. Ostrzegam, przeczytaj drobnym drukiem! Jeśli łączysz ścieżki, użyj: var newPath = path1 + @"\" + path2; prostszy i bez niespodziewanych wyników ...

+0

Pełna ścieżka po prawej stronie zwracana w wyniku łączenia względnych ścieżek jest poprawnym i prawidłowym wynikiem. –

+1

Niezależnie od tego, czy jest to poprawny i prawidłowy wynik, zbyt wielu twórcom brakuje tego, że jeśli w ich arg1 jest ścieżka do folderu, a arg2 to dane wejściowe użytkownika, bezwzględna ścieżka wejściowa arg2 będzie wynikowym wyjściem. Sprawia, że ​​zbyt łatwo jest otworzyć, moim zdaniem, najgorszy z hacków aplikacji internetowych .. Wstrzykiwanie kodu/powłoki ... Sprawdź swoje dane wejściowe. – Cyassin

+0

Moim zdaniem, każdy programista, który uważa, że ​​jest w stanie zezwolić użytkownikowi na wpisywanie ścieżek bez żadnej kontroli - zasługuje na zhackowanie. To jest dzieło pierwszego dnia, a Path.Combine nie jest zaprojektowany tak, jak uważasz, że powinien - jest to przyzwoity i niezawodny sposób, aby uniknąć konieczności sprawdzania końcowego ukośnika odwrotnego, który jest faktycznie przeznaczony do użytku wewnętrznego przez twój kod, nie jako front end do zabezpieczenia twoich plików. Dokumentacja jest kompletna - po prostu przeczytaj. – jinzai

Powiązane problemy