Ich programmiere in WPF C #. Ich habe zB folgenden Weg:
C:\Program Files\hello.txt
und ich möchte daraus extrahieren hello
.
Der Pfad wird string
aus einer Datenbank abgerufen. Derzeit verwende ich den folgenden Code, um den Pfad zu teilen '\'
und dann erneut zu teilen '.'
:
string path = "C:\\Program Files\\hello.txt";
string[] pathArr = path.Split('\\');
string[] fileArr = pathArr.Last().Split('.');
string fileName = fileArr.Last().ToString();
Es funktioniert, aber ich glaube, es sollte eine kürzere und intelligentere Lösung dafür geben. Irgendeine Idee?
Path.GetFileName("C:\\dev\\some\\path\\to\\file.cs")
Gibt in meinem System dieselbe Zeichenfolge zurück und konvertiert sie aus irgendeinem Grund nicht in "file.cs". Wenn ich meinen Code in einen Online-Compiler (wie rextester.com ) kopiere / einfüge , funktioniert es ...?Antworten:
Path.GetFileName
Path.GetFileNameWithoutExtension
Die Path- Klasse ist wunderbar.
quelle
Versuchen
http://msdn.microsoft.com/de-de/library/system.io.path.getfilename.aspx
quelle
Versuchen
Demo
https://msdn.microsoft.com/en-gb/library/system.io.path.getfilenamewithoutextension%28v=vs.80%29.aspx
quelle
Sie können die Pfad- API wie folgt verwenden:
Weitere Informationen: Path.GetFileNameWithoutExtension
quelle
Path.GetFileNameWithoutExtension
quelle
Versuche dies:
Dies gibt "Hallo" für Dateiname zurück.
quelle
quelle
Versuche dies,
quelle
quelle
FileVersionInfo
dies für Dateien verwendet werden kann, die keine Versionsinformationen enthalten. Beachten Sie, dassGetVersionInfo()
dies nur für Pfade verwendet werden kann, die auf eine bereits vorhandene Datei verweisen. Während jede Klasse verwendet werden kann, um den Dateinamen abzurufen, wurde in der Frage auch gefragt, ob die Erweiterung ebenfalls entfernt werden soll.Erstens erzeugt der Code in der Frage nicht die beschriebene Ausgabe. Es extrahiert die Datei - Erweiterung (
"txt"
) und nicht die Datei Basisnamen ("hello"
). Zu tun , dass die letzte Zeile nennen sollteFirst()
, nichtLast()
, wie dieser ...Nachdem Sie diese Änderung vorgenommen haben, sollten Sie bei der Verbesserung dieses Codes über die Menge an Müll nachdenken, die er erzeugt:
string[]
enthält einestring
für jedes Pfadsegment inpath
string[]
enthaltend mindestens einstring
für jedes.
in dem letzten Pfadsegment inpath
Daher Extrahieren der Basisdateinamen von dem Probenweg
"C:\Program Files\hello.txt"
sollte erzeugt die (temporäre)object
s"C:"
,"Program Files"
,"hello.txt"
,"hello"
,"txt"
, astring[3]
, und astring[2]
. Dies kann von Bedeutung sein, wenn die Methode auf einer großen Anzahl von Pfaden aufgerufen wird. Um dies zu verbessern, können wirpath
uns selbst suchen , um den Start- und Endpunkt des Basisnamens zu finden und diese zu verwenden, um einen neuenstring
...Hierbei wird der Index des Zeichens nach dem letzten
\
als Anfang des Basisnamens verwendet und von dort aus nach dem ersten gesucht,.
der nach dem Ende des Basisnamens als Index des Zeichens verwendet werden soll. Ist das kürzer als der ursprüngliche Code? Nicht ganz. Ist es eine "intelligentere" Lösung? Ich glaube schon. Zumindest wäre es ohne die Tatsache, dass ...Wie Sie dem Kommentar entnehmen können, ist die vorherige Methode problematisch. Obwohl dies funktioniert, wenn Sie davon ausgehen, dass alle Pfade mit einem Dateinamen mit einer Erweiterung enden, wird eine Ausnahme ausgelöst, wenn der Pfad mit
\
(dh einem Verzeichnispfad) endet oder auf andere Weise keine Erweiterung im letzten Segment enthält. Um dies zu beheben, müssen wir einen zusätzlichen Scheck - Konto für hinzufügen , wennendIndex
ist-1
(dh.
nicht gefunden wird ) ...Jetzt ist diese Version bei weitem nicht kürzer als das Original, aber sie ist effizienter und (jetzt) auch korrekt.
In Bezug auf .NET-Methoden, die diese Funktionalität implementieren, schlagen viele andere Antworten die Verwendung vor. Dies
Path.GetFileNameWithoutExtension()
ist eine offensichtliche, einfache Lösung, führt jedoch nicht zu den gleichen Ergebnissen wie der Code in der Frage. Es gibt einen subtilen, aber wichtigen Unterschied zwischenGetFileBaseNameUsingSplit()
undPath.GetFileNameWithoutExtension()
(GetFileBaseNameUsingPath()
unten): Ersteres extrahiert alles vor dem ersten.
und Letzteres extrahiert alles vor dem letzten.
. Dies macht für die Stichprobepath
in der Frage keinen Unterschied , aber sehen Sie sich diese Tabelle an, in der die Ergebnisse der oben genannten vier Methoden verglichen werden, wenn sie mit verschiedenen Pfaden aufgerufen werden ...... und Sie werden sehen, dass
Path.GetFileNameWithoutExtension()
unterschiedliche Ergebnisse erzielt werden, wenn ein Pfad übergeben wird, in dem der Dateiname eine doppelte Erweiterung oder eine führende und / oder nachfolgende hat.
. Sie können es selbst mit dem folgenden Code versuchen ...TL; DR Der Code in der Frage verhält sich in einigen Eckfällen nicht so, wie es viele zu erwarten scheinen . Wenn Sie Ihren eigenen Pfadmanipulationscode schreiben möchten, müssen Sie Folgendes berücksichtigen ...
.
oder alles vor dem letzten.
?).
.
(wahrscheinlich nicht etwas, auf das Sie jemals unter Windows stoßen werden, aber sie sind möglich ).
\
Nicht alle Dateipfade folgen der üblichen Formel von
X:\Directory\File.ext
!quelle
quelle