Programuję w WPF C #. Mam np. Następującą ścieżkę:
C:\Program Files\hello.txt
i chcę hello
z niego wyciągnąć .
Ścieżka jest string
pobierana z bazy danych. Obecnie używam następującego kodu, aby podzielić ścieżkę, '\'
a następnie ponownie podzielić przez '.'
:
string path = "C:\\Program Files\\hello.txt";
string[] pathArr = path.Split('\\');
string[] fileArr = pathArr.Last().Split('.');
string fileName = fileArr.Last().ToString();
Działa, ale uważam, że powinno być krótsze i mądrzejsze rozwiązanie tego problemu. Dowolny pomysł?
Path.GetFileName("C:\\dev\\some\\path\\to\\file.cs")
zwraca ten sam ciąg i z jakiegoś powodu nie konwertuje go do pliku „file.cs”. Jeśli skopiuję / wkleję mój kod do kompilatora online (takiego jak rextester.com ), to zadziała ...?Odpowiedzi:
Path.GetFileName
Path.GetFileNameWithoutExtension
Ścieżka klasa jest wspaniała.
źródło
próbować
http://msdn.microsoft.com/de-de/library/system.io.path.getfilename.aspx
źródło
próbować
próbny
https://msdn.microsoft.com/en-gb/library/system.io.path.getfilenamewithoutextension%28v=vs.80%29.aspx
źródło
Możesz użyć Path API w następujący sposób:
Więcej informacji: Path.GetFileNameWithoutExtension
źródło
Path.GetFileNameWithoutExtension
źródło
Spróbuj tego:
Zwróci „hello” dla fileName.
źródło
źródło
Spróbuj tego,
źródło
źródło
FileVersionInfo
można go używać w plikach, które nie zawierają informacji o wersji. Uwaga:GetVersionInfo()
można go używać tylko w przypadku ścieżek, które odwołują się do pliku, który już istnieje. Chociaż do uzyskania nazwy pliku można użyć dowolnej klasy, pytanie również wymaga usunięcia rozszerzenia.Po pierwsze, kod w pytaniu nie generuje opisanego wyniku. Wyodrębnia rozszerzenie pliku (
"txt"
), a nie podstawową nazwę pliku ("hello"
). Aby to zrobić, ostatnia linia powinna zadzwonićFirst()
, a nieLast()
tak ...Po dokonaniu tej zmiany, jedną z rzeczy, o których należy pomyśleć w zakresie poprawy tego kodu, jest ilość śmieci, które tworzy:
string[]
Zawierający jedenstring
dla każdego odcinka toru wpath
string[]
Zawierający co najmniej jednąstring
dla każdego.
segmentu ostatnią drogępath
Dlatego też, ekstrahowanie nazwy pliku, z drogi próbkowania
"C:\Program Files\hello.txt"
powinna produkować (tymczasowego)object
y"C:"
,"Program Files"
,"hello.txt"
,"hello"
,"txt"
, Astring[3]
istring[2]
. Może to mieć znaczenie, jeśli metoda zostanie wywołana na dużej liczbie ścieżek. Aby to poprawić, możemy przeszukaćpath
siebie, aby zlokalizować punkty początkowe i końcowe nazwy bazowej i użyć ich do utworzenia jednego nowegostring
...Wykorzystuje to indeks znaku po ostatnim
\
jako początek nazwy podstawowej, a stamtąd szuka pierwszego,.
który będzie używany jako indeks znaku po końcu nazwy podstawowej. Czy to jest krótszy niż oryginalny kod? Nie do końca. Czy to „mądrzejsze” rozwiązanie? Chyba tak. Przynajmniej byłoby tak, gdyby nie fakt, że ...Jak widać z komentarza, poprzednia metoda jest problematyczna. Chociaż działa, jeśli założysz, że wszystkie ścieżki kończą się nazwą pliku z rozszerzeniem, zgłasza wyjątek, jeśli ścieżka kończy się na
\
(tj. Ścieżka katalogu) lub w inny sposób nie zawiera rozszerzenia w ostatnim segmencie. Aby to naprawić, musimy dodać dodatkowy czek, aby uwzględnić, kiedyendIndex
jest-1
(tzn..
Nie został znaleziony) ...Teraz ta wersja nie jest prawie krótsza niż oryginalna, ale jest również bardziej wydajna i (teraz) poprawna.
Jeśli chodzi o metody .NET, które implementują tę funkcjonalność, wiele innych odpowiedzi sugeruje użycie
Path.GetFileNameWithoutExtension()
, co jest oczywistym, łatwym rozwiązaniem, ale nie daje takich samych wyników jak kod w pytaniu. Istnieje subtelna, ale ważna różnica międzyGetFileBaseNameUsingSplit()
iPath.GetFileNameWithoutExtension()
(GetFileBaseNameUsingPath()
poniżej): pierwszy wyodrębnia wszystko przed pierwszym,.
a drugi wyodrębnia wszystko przed ostatnim.
. Nie ma to znaczenia dla próbkipath
w pytaniu, ale spójrz na tabelę porównującą wyniki powyższych czterech metod, gdy są wywoływane z różnymi ścieżkami ...... a zobaczysz, że
Path.GetFileNameWithoutExtension()
daje to inne wyniki, gdy przejdziesz ścieżkę, w której nazwa pliku ma podwójne rozszerzenie lub początkowe i / lub końcowe.
. Możesz spróbować samemu, używając następującego kodu ...TL; DR Kod w pytaniu nie zachowuje się tak, jak wielu wydaje się oczekiwać w niektórych przypadkach narożnych. Jeśli masz zamiar napisać własny kod do manipulacji ścieżką, pamiętaj, aby wziąć pod uwagę ...
.
czy wszystko przed ostatnim.
?).
.
(prawdopodobnie nie jest to coś, co można napotkać w systemie Windows, ale są one możliwe ).
\
Nie wszystkie ścieżki plików są zgodne ze zwykłą formułą
X:\Directory\File.ext
!źródło
źródło