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.

sharon Hwk
la source
en référence à issuetracker.google.com/issues/37131215 , il a été corrigé.
Prags

Réponses:

281

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));
PermGenError
la source
Utile. Merci.
Pooja
Soyez prudent avec les chemins d'accès avec "/" au lieu de "\"
golimar
278

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#getNames'occupe de ce problème pour vous.

assylias
la source
1
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.
nyxz
3
Appeler toString()est tellement gênant.
PetroCliff
53

Utilisation FilenameUtilsdans Apache Commons IO :

String name1 = FilenameUtils.getName("/ab/cd/xyz.txt");
String name2 = FilenameUtils.getName("c:\\ab\\cd\\xyz.txt");
Binoy Babu
la source
5
Je pense que celui-ci peut être le meilleur, car parfois vous devrez peut-être traiter le chemin du fichier à partir d'une autre plate
ruiruige1991
C'est le meilleur parce que: Facile à lire, le plus robuste, le moins d'obstacles dans le code +1
fl0w
32

Considérant Stringque 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 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

-1 s'il n'y a pas une telle occurrence

Sotirios Delimanolis
la source
25

Depuis 1.7

    Path p = Paths.get("c:\\temp\\1.txt");
    String fileName = p.getFileName().toString();
    String directory = p.getParent().toString();
max3d
la source
11

vous pouvez utiliser path = C: \ Hello \ AnotherFolder \ TheFileName.PDF

String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());
Rakesh
la source
Vous devez utiliser \\ au lieu de \
Anoop Chandrika HarisudhanNair
2
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'

La solution avec laquelle je me suis retrouvé:

String filenameWithPath = "C:\\temp\\hello.xls";
String[] tokens = filenameWithPath.split("[\\\\|/]");
String filename = tokens[tokens.length - 1];
javaPhobic
la source
3

Considérons le cas où Java est multiplateforme:

int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
    fileName = fileName.substring(lastPath+1);
}
Alejandro Hdz
la source
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.

yavuzkavus
la source
0

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;
    }
HJK
la source
0

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);
Phoenix bleu
la source