Comment puis-je obtenir le nom de fichier à partir d'une chaîne contenant le chemin de fichier absolu?
237
Stringvariable contient un nom de fichier, C:\Hello\AnotherFolder\The File Name.PDF. Comment obtenir uniquement le nom de fichier The File Name.PDFsous forme de chaîne?
J'ai prévu de diviser la chaîne, mais ce n'est pas la solution optimale.
File f =newFile("C:\\Hello\\AnotherFolder\\The File Name.PDF");System.out.println(f.getName());
en utilisant des méthodes String :
File f =newFile("C:\\Hello\\AnotherFolder\\The File Name.PDF");System.out.println(f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("\\")+1));
Path p =Paths.get("C:\\Hello\\AnotherFolder\\The File Name.PDF");String file = p.getFileName().toString();
Notez que le fractionnement de la chaîne \\dépend de la plate-forme car le séparateur de fichiers peut varier. Path#getNames'occupe de ce problème pour vous.
Quelqu'un at-il fait une comparaison des performances sur les différentes méthodes de cette question?
écraser
@crush Je ne pense pas que cela Paths.getaccède au système de fichiers, donc je ne m'attendrais pas à ce que les performances soient matériellement différentes d'une sous-chaîne / indexOf.
assylias
7
Comment se fait-il qu'il n'existe pas sur Android? bizarre.
développeur Android
12
Oui, Path résout le problème de slash / backslash dépendant de la plate-forme, mais uniquement si le chemin du fichier provient de la même machine (ou plate-forme). Considérez ceci: vous téléchargez un fichier depuis Internet Exploreret il a le chemin, "C:\\Hello\\AnotherFolder\\The File Name.PDF"mais votre code fonctionne sur une machine Unix / Linux, puis p.getFileName()retournera tout le chemin, pas seulement The File Name.PDF.
Cela va récupérer l'index du dernier \dans votre Stringet extraire tout ce qui vient après fileName.
Si vous avez un Stringavec un séparateur différent, ajustez le lastIndexOfpour utiliser ce séparateur. (Il y a même une surcharge qui accepte un tout Stringcomme séparateur.)
Je l'ai omis dans l'exemple ci-dessus, mais si vous ne savez pas d'où Stringvient le contenu ou ce qu'il pourrait contenir, vous voudrez valider que le lastIndexOfretourne une valeur non négative car le Javadoc déclare qu'il va retourner
Vous ne devez en utiliser aucun car il dépend de la plateforme. /sous unix et \`(AND THERE IS A BUG IN THE MARKDOWN PARSER HERE) on windows. You can't know. Use another solution like File` ou Paths.
Automatico
3
Est-ce que la File.separatorplateforme dépend aussi? Ou est-ce que cela fonctionnerait ... String strPath = path.substring(path.lastIndexOf(File.separator)+1, path.length());
Jonathan
File.separator & File.separatorChar sont tous deux "/" sur la version UNIX / Linux / macOS de JDK, et les deux "\" sur la version Windows.
可 可 Jacky
2
File.separatorne fonctionnera pas toujours ici car sous Windows, un nom de fichier peut être séparé par "/"ou "\\".
DodgyCodeException
10
Les autres réponses ne fonctionnaient pas tout à fait pour mon scénario spécifique, où je lis des chemins qui proviennent d'un système d'exploitation différent du mien actuel. Pour élaborer, j'enregistre les pièces jointes enregistrées à partir d'une plate-forme Windows sur un serveur Linux. Le nom de fichier renvoyé par l'API JavaMail est quelque chose comme 'C: \ temp \ hello.xls'
Peut-être que getFileName est un peu déroutant, car il renvoie également les noms de répertoire. Il renvoie le nom du fichier ou du dernier répertoire d'un chemin.
Vous pouvez utiliser l'objet FileInfo pour obtenir toutes les informations de votre fichier.
FileInfo f =newFileInfo(@"C:\Hello\AnotherFolder\The File Name.PDF");MessageBox.Show(f.Name);MessageBox.Show(f.FullName);MessageBox.Show(f.Extension);MessageBox.Show(f.DirectoryName);
Réponses:
utilisez simplement File.getName ()
en utilisant des méthodes String :
la source
Utilisation alternative
Path
(Java 7+):Notez que le fractionnement de la chaîne
\\
dépend de la plate-forme car le séparateur de fichiers peut varier.Path#getName
s'occupe de ce problème pour vous.la source
Paths.get
accède au système de fichiers, donc je ne m'attendrais pas à ce que les performances soient matériellement différentes d'une sous-chaîne / indexOf.Internet Explorer
et il a le chemin,"C:\\Hello\\AnotherFolder\\The File Name.PDF"
mais votre code fonctionne sur une machine Unix / Linux, puisp.getFileName()
retournera tout le chemin, pas seulementThe File Name.PDF
.toString()
est tellement gênant.Utilisation
FilenameUtils
dans Apache Commons IO :la source
Considérant
String
que vous demandez estnous devons tout extraire après le dernier séparateur, ce est à dire.
\
. C'est ce qui nous intéresse.Tu peux faire
Cela va récupérer l'index du dernier
\
dans votreString
et extraire tout ce qui vient aprèsfileName
.Si vous avez un
String
avec un séparateur différent, ajustez lelastIndexOf
pour utiliser ce séparateur. (Il y a même une surcharge qui accepte un toutString
comme séparateur.)Je l'ai omis dans l'exemple ci-dessus, mais si vous ne savez pas d'où
String
vient le contenu ou ce qu'il pourrait contenir, vous voudrez valider que lelastIndexOf
retourne une valeur non négative car le Javadoc déclare qu'il va retournerla source
Depuis 1.7
la source
vous pouvez utiliser path = C: \ Hello \ AnotherFolder \ TheFileName.PDF
la source
/
sous unix et\`(AND THERE IS A BUG IN THE MARKDOWN PARSER HERE) on windows. You can't know. Use another solution like
File` ouPaths
.File.separator
plateforme dépend aussi? Ou est-ce que cela fonctionnerait ...String strPath = path.substring(path.lastIndexOf(File.separator)+1, path.length());
File.separator
ne fonctionnera pas toujours ici car sous Windows, un nom de fichier peut être séparé par"/"
ou"\\"
.Les autres réponses ne fonctionnaient pas tout à fait pour mon scénario spécifique, où je lis des chemins qui proviennent d'un système d'exploitation différent du mien actuel. Pour élaborer, j'enregistre les pièces jointes enregistrées à partir d'une plate-forme Windows sur un serveur Linux. Le nom de fichier renvoyé par l'API JavaMail est quelque chose comme 'C: \ temp \ hello.xls'
La solution avec laquelle je me suis retrouvé:
la source
Considérons le cas où Java est multiplateforme:
la source
Une méthode sans aucune dépendance et prend en charge .. , . et séparateurs en double.
Cas de test:
Peut-être que getFileName est un peu déroutant, car il renvoie également les noms de répertoire. Il renvoie le nom du fichier ou du dernier répertoire d'un chemin.
la source
extraire le nom du fichier à l'aide de regex java *.
la source
Méthode getFileName () de java.nio.file.Path utilisée pour renvoyer le nom du fichier ou du répertoire pointé par cet objet chemin.
Chemin getFileName ()
Pour référence:
https://www.geeksforgeeks.org/path-getfilename-method-in-java-with-examples/
la source
Vous pouvez utiliser l'objet FileInfo pour obtenir toutes les informations de votre fichier.
la source