web-dev-qa-db-fra.com

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

La variable String contient un nom de fichier, C:\Hello\AnotherFolder\The File Name.PDF. Comment obtenir le nom de fichier The File Name.PDF en tant que chaîne?

J'avais prévu de scinder la chaîne, mais ce n'est pas la solution optimale.

207
sharon Hwk

il suffit d'utiliser File.getName ()

File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getName());

using Méthodes de chaîne :

  File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");  
System.out.println(f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("\\")+1));
247
PermGenError

Alternative utilisant Path (Java 7+):

Path p = Paths.get("C:\\Hello\\AnotherFolder\\The File Name.PDF");
String file = p.getFileName().toString();

Notez que la division de la chaîne sur \\ dépend de la plate-forme, car le séparateur de fichier peut varier. Path#getName s'occupe de ce problème pour vous.

257
assylias

Utilisation de FilenameUtils dans Apache Commons IO :

String name1 = FilenameUtils.getName("/ab/cd/xyz.txt");
String name2 = FilenameUtils.getName("c:\\ab\\cd\\xyz.txt");
47
Binoy Babu

Considérant la String dont vous parlez, c’est

C:\Hello\AnotherFolder\The File Name.PDF

nous devons tout extraire après le dernier séparateur, c'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);

Ceci récupérera l'index du dernier \ dans votre String et extraira tout ce qui le suit dans 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 un - surcharge qui accepte un String entier en tant que séparateur.)

Je l'ai omis dans l'exemple ci-dessus, mais si vous ne savez pas d'où vient la String ou ce qu'elle pourrait contenir, vous voudrez valider que la lastIndexOf renvoie une valeur non négative. parce que = Javadoc ça va revenir

-1 s'il n'y en a pas

32

Depuis 1.7

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

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

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

Les autres réponses ne fonctionnaient pas tout à fait pour mon scénario spécifique, où je lisais des chemins qui provenaient d’un système d’exploitation différent de celui que je suis actuellement. Pour élaborer, j'enregistre les pièces jointes des courriels sauvegardé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];
8
javaPhobic

Considérons le cas où Java est Multiplatform:

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

Une méthode sans aucune dépendance et prend en charge les séparateurs .., . et 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épertoires. Il retourne le nom du fichier ou le dernier répertoire dans un chemin.

1
yavuzkavus

extraire le nom du fichier en utilisant Java regex *.

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
HJK