Comment puis-je obtenir le nom de fichier à partir d'une chaîne contenant le chemin de fichier absolu?


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));

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.


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");

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


25

Depuis 1.7

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

11

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

String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());

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];

3

Considérons le cas où Java est multiplateforme:

int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
    fileName = fileName.substring(lastPath+1);
}

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.


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;
    }


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);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.