Je programme en WPF C #. J'ai par exemple le chemin suivant:
C:\Program Files\hello.txt
et je veux en extraire hello
.
Le chemin d'accès est string
extrait d'une base de données. Actuellement, j'utilise le code suivant pour diviser le chemin par '\'
, puis à nouveau diviser par '.'
:
string path = "C:\\Program Files\\hello.txt";
string[] pathArr = path.Split('\\');
string[] fileArr = pathArr.Last().Split('.');
string fileName = fileArr.Last().ToString();
Cela fonctionne, mais je pense qu'il devrait y avoir une solution plus courte et plus intelligente à cela. Une idée?
Path.GetFileName("C:\\dev\\some\\path\\to\\file.cs")
renvoie la même chaîne et ne la convertit pas en "file.cs" pour une raison quelconque. Si je copie / colle mon code dans un compilateur en ligne (comme rextester.com ), cela fonctionne ...?Réponses:
Path.GetFileName
Path.GetFileNameWithoutExtension
La classe Path est merveilleuse.
la source
essayer
http://msdn.microsoft.com/de-de/library/system.io.path.getfilename.aspx
la source
essayer
démo
https://msdn.microsoft.com/en-gb/library/system.io.path.getfilenamewithoutextension%28v=vs.80%29.aspx
la source
Vous pouvez utiliser l' API Path comme suit:
Plus d'informations: Path.GetFileNameWithoutExtension
la source
Path.GetFileNameWithoutExtension
la source
Essaye ça:
Cela renverra "bonjour" pour fileName.
la source
la source
Essaye ça,
la source
la source
FileVersionInfo
puisse être utilisé sur des fichiers qui n'ont pas d'informations sur la version. Notez queGetVersionInfo()
cela ne peut être utilisé que sur des chemins faisant référence à un fichier qui existe déjà. Bien que l'une ou l'autre classe puisse être utilisée pour obtenir le nom du fichier, la question a également demandé de supprimer l'extension également.Premièrement, le code dans la question ne produit pas la sortie décrite. Il extrait l' extension de fichier (
"txt"
) et non le nom de base du fichier ("hello"
). Pour ce faire, la dernière ligne doit appelerFirst()
, pasLast()
, comme ça ...Après avoir apporté ce changement, une chose à laquelle penser en ce qui concerne l'amélioration de ce code est la quantité de déchets qu'il crée:
string[]
contenant unstring
pour chaque segment de chemin danspath
string[]
contenant au moins unstring
pour chacun.
dans le dernier segment de cheminpath
Par conséquent, extraire le nom du fichier de base à partir du chemin d'échantillon
"C:\Program Files\hello.txt"
doit produire le (temporaire)object
s"C:"
,"Program Files"
,"hello.txt"
,"hello"
,"txt"
, unstring[3]
, et unstring[2]
. Cela peut être significatif si la méthode est appelée sur un grand nombre de chemins. Pour améliorer cela, nous pouvons rechercherpath
nous-mêmes pour localiser les points de début et de fin du nom de base et les utiliser pour en créer un nouveaustring
...C'est utiliser l'index du caractère après le dernier
\
comme début du nom de base, et à partir de là chercher le premier.
à utiliser comme index du caractère après la fin du nom de base. Est-ce plus court que le code d'origine? Pas assez. Est-ce une solution "plus intelligente"? Je le pense. Du moins, ce serait sans le fait que ...Comme vous pouvez le voir dans le commentaire, la méthode précédente est problématique. Bien que cela fonctionne si vous supposez que tous les chemins se terminent par un nom de fichier avec une extension, il lèvera une exception si le chemin se termine par
\
(c'est-à-dire un chemin de répertoire) ou ne contient aucune extension dans le dernier segment. Pour résoudre ce problème, nous avons besoin d'ajouter un contrôle supplémentaire pour compte quandendIndex
est-1
(c. -à-.
ne se trouve pas) ...Maintenant, cette version est loin d'être plus courte que l'original, mais elle est plus efficace et (maintenant) correcte aussi.
En ce qui concerne les méthodes .NET qui implémentent cette fonctionnalité, de nombreuses autres réponses suggèrent d'utiliser
Path.GetFileNameWithoutExtension()
, ce qui est une solution évidente et facile mais ne produit pas les mêmes résultats que le code de la question. Il y a une différence subtile mais importante entreGetFileBaseNameUsingSplit()
etPath.GetFileNameWithoutExtension()
(GetFileBaseNameUsingPath()
ci-dessous): le premier extrait tout avant le premier.
et le dernier extrait tout avant le dernier.
. Cela ne fait aucune différence pour l'échantillonpath
de la question, mais jetez un œil à ce tableau comparant les résultats des quatre méthodes ci-dessus lorsqu'ils sont appelés avec différents chemins ...... et vous verrez que cela
Path.GetFileNameWithoutExtension()
donne des résultats différents lorsque vous passez un chemin où le nom de fichier a une double extension ou un début et / ou une fin.
. Vous pouvez l'essayer par vous-même avec le code suivant ...TL; DR Le code dans la question ne se comporte pas comme beaucoup semblent s'y attendre dans certains cas de coin. Si vous allez écrire votre propre code de manipulation de chemin, assurez-vous de prendre en considération ...
.
ou tout avant le dernier.
?).
.
(probablement pas quelque chose que vous rencontrerez jamais sur Windows, mais ils sont possibles ).
\
Tous les chemins de fichiers ne suivent pas la formule habituelle de
X:\Directory\File.ext
!la source
la source