String
variable contient un nom de fichier, C:\Hello\AnotherFolder\The File Name.PDF
. Comment obtenir uniquement le nom de fichier The File Name.PDF
sous forme de chaîne?
J'ai prévu de diviser la chaîne, mais ce n'est pas la solution optimale.
String
variable contient un nom de fichier, C:\Hello\AnotherFolder\The File Name.PDF
. Comment obtenir uniquement le nom de fichier The File Name.PDF
sous forme de chaîne?
J'ai prévu de diviser la chaîne, mais ce n'est pas la solution optimale.
Réponses:
utilisez simplement File.getName ()
File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getName());
en utilisant des méthodes String :
File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("\\")+1));
Utilisation alternative Path
(Java 7+):
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#getName
s'occupe de ce problème pour vous.
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, puis p.getFileName()
retournera tout le chemin, pas seulement The File Name.PDF
.
toString()
est tellement gênant.
Utilisation FilenameUtils
dans Apache Commons IO :
String name1 = FilenameUtils.getName("/ab/cd/xyz.txt");
String name2 = FilenameUtils.getName("c:\\ab\\cd\\xyz.txt");
Considérant String
que vous demandez est
C:\Hello\AnotherFolder\The File Name.PDF
nous devons tout extraire après le dernier séparateur, ce est à dire. \
. C'est ce qui nous intéresse.
Tu peux faire
String fullPath = "C:\\Hello\\AnotherFolder\\The File Name.PDF";
int index = fullPath.lastIndexOf("\\");
String fileName = fullPath.substring(index + 1);
Cela va récupérer l'index du dernier \
dans votre String
et extraire tout ce qui vient après fileName
.
Si vous avez un String
avec un séparateur différent, ajustez le lastIndexOf
pour utiliser ce séparateur. (Il y a même une surcharge qui accepte un tout String
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 le lastIndexOf
retourne une valeur non négative car le Javadoc déclare qu'il va retourner
-1 s'il n'y a pas une telle occurrence
vous pouvez utiliser path = C: \ Hello \ AnotherFolder \ TheFileName.PDF
String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());
/
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
.
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é:
String filenameWithPath = "C:\\temp\\hello.xls";
String[] tokens = filenameWithPath.split("[\\\\|/]");
String filename = tokens[tokens.length - 1];
Considérons le cas où Java est multiplateforme:
int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
fileName = fileName.substring(lastPath+1);
}
Une méthode sans aucune dépendance et prend en charge .. , . et séparateurs en double.
public static String getFileName(String filePath) {
if( filePath==null || filePath.length()==0 )
return "";
filePath = filePath.replaceAll("[/\\\\]+", "/");
int len = filePath.length(),
upCount = 0;
while( len>0 ) {
//remove trailing separator
if( filePath.charAt(len-1)=='/' ) {
len--;
if( len==0 )
return "";
}
int lastInd = filePath.lastIndexOf('/', len-1);
String fileName = filePath.substring(lastInd+1, len);
if( fileName.equals(".") ) {
len--;
}
else if( fileName.equals("..") ) {
len -= 2;
upCount++;
}
else {
if( upCount==0 )
return fileName;
upCount--;
len -= fileName.length();
}
}
return "";
}
Cas de test:
@Test
public void testGetFileName() {
assertEquals("", getFileName("/"));
assertEquals("", getFileName("////"));
assertEquals("", getFileName("//C//.//../"));
assertEquals("", getFileName("C//.//../"));
assertEquals("C", getFileName("C"));
assertEquals("C", getFileName("/C"));
assertEquals("C", getFileName("/C/"));
assertEquals("C", getFileName("//C//"));
assertEquals("C", getFileName("/A/B/C/"));
assertEquals("C", getFileName("/A/B/C"));
assertEquals("C", getFileName("/C/./B/../"));
assertEquals("C", getFileName("//C//./B//..///"));
assertEquals("user", getFileName("/user/java/.."));
assertEquals("C:", getFileName("C:"));
assertEquals("C:", getFileName("/C:"));
assertEquals("java", getFileName("C:\\Program Files (x86)\\java\\bin\\.."));
assertEquals("C.ext", getFileName("/A/B/C.ext"));
assertEquals("C.ext", getFileName("C.ext"));
}
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.
extraire le nom du fichier à l'aide de regex java *.
public String extractFileName(String fullPathFile){
try {
Pattern regex = Pattern.compile("([^\\\\/:*?\"<>|\r\n]+$)");
Matcher regexMatcher = regex.matcher(fullPathFile);
if (regexMatcher.find()){
return regexMatcher.group(1);
}
} catch (PatternSyntaxException ex) {
LOG.info("extractFileName::pattern problem <"+fullPathFile+">",ex);
}
return fullPathFile;
}
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/
Vous pouvez utiliser l'objet FileInfo pour obtenir toutes les informations de votre fichier.
FileInfo f = new FileInfo(@"C:\Hello\AnotherFolder\The File Name.PDF");
MessageBox.Show(f.Name);
MessageBox.Show(f.FullName);
MessageBox.Show(f.Extension );
MessageBox.Show(f.DirectoryName);