Comment obtenir uniquement le nom du répertoire parent d'un fichier spécifique


111

Comment obtenir à dddpartir du nom du chemin où réside le test.java.

File file = new File("C:/aaa/bbb/ccc/ddd/test.java");

1
S'agit-il d'un fichier générique ou essayez-vous d'obtenir le répertoire parent de votre fichier source? Dans ce dernier cas, je ne suis pas sûr que vous compreniez la compilation Java. Au moment de l'exécution, test.javail n'existera probablement même pas sur l'ordinateur sur lequel le programme est exécuté. C'est le .classfichier compilé qui est exécuté. Donc, cela ne fonctionnera que si vous savez où dddse trouve, auquel cas il ne sert à rien de le trouver par programme; codez-le simplement en dur.
Mark Peters

Réponses:


141

Utilisez Filela getParentFile()méthode de et String.lastIndexOf()pour récupérer uniquement le répertoire parent immédiat.

Le commentaire de Mark est une meilleure solution que lastIndexOf():

file.getParentFile().getName();

Ces solutions ne fonctionnent que si le fichier a un fichier parent (par exemple, créé via l'un des constructeurs de fichiers prenant un parent File). Quand getParentFile()est null, vous devrez recourir à l'utilisation lastIndexOf, ou utiliser quelque chose comme Apache Commons 'FileNameUtils.getFullPath() :

FilenameUtils.getFullPathNoEndSeparator(file.getAbsolutePath());
=> C:/aaa/bbb/ccc/ddd

Il existe plusieurs variantes pour conserver / supprimer le préfixe et le séparateur de fin. Vous pouvez soit utiliser la même FilenameUtilsclasse pour récupérer le nom du résultat, utiliser lastIndexOf, etc.


14
Vous n'avez pas besoin lastIndexOf, utilisez simplement file.getParentFile().getName().
Mark Peters

13
Au cas où. S'il retourne null(si vous avez créé une Fileinstance avec un chemin relatif) - essayez file.getAbsoluteFile().getParentFile().getName().
nidu

1
@MarkPeters Cela ne fonctionne que lorsque le fichier a été créé avec un fichier parent, ce qui, je suppose, est relativement rare.
Dave Newton

20
File f = new File("C:/aaa/bbb/ccc/ddd/test.java");
System.out.println(f.getParentFile().getName())

f.getParentFile() peut être nul, vous devriez donc le vérifier.


1
Juste pour être sûr, la sortie est la suivante: C: / aaa / bbb / ccc / ddd
Guy Avraham

16

Utilisez ci-dessous,

File file = new File("file/path");
String parentPath = file.getAbsoluteFile().getParent();

Il convient de souligner que cette méthode doit avoir un ensemble parent, même si le fichier sous-jacent n'en a pas.
Pace

13

Dans Java 7, vous avez la nouvelle API Paths . La solution moderne et la plus propre est:

Paths.get("C:/aaa/bbb/ccc/ddd/test.java").getParent().getFileName();

Le résultat serait:

C:/aaa/bbb/ccc/ddd

5

Si vous n'avez que le chemin String et que vous ne voulez pas créer un nouvel objet File, vous pouvez utiliser quelque chose comme:

public static String getParentDirPath(String fileOrDirPath) {
    boolean endsWithSlash = fileOrDirPath.endsWith(File.separator);
    return fileOrDirPath.substring(0, fileOrDirPath.lastIndexOf(File.separatorChar, 
            endsWithSlash ? fileOrDirPath.length() - 2 : fileOrDirPath.length() - 1));
}

4
Cela lève ArrayOutOfBoundsException si vous êtes déjà à l'emplacement racine - "/" -
Jnmgr

2
File file = new File("C:/aaa/bbb/ccc/ddd/test.java");
File curentPath = new File(file.getParent());
//get current path "C:/aaa/bbb/ccc/ddd/"
String currentFolder= currentPath.getName().toString();
//get name of file to string "ddd"

si vous devez ajouter le dossier "ddd" par un autre chemin, utilisez;

String currentFolder= "/" + currentPath.getName().toString();

1

De java 7, je préférerais utiliser Path. Il vous suffit de mettre le chemin dans:

Path dddDirectoryPath = Paths.get("C:/aaa/bbb/ccc/ddd/test.java");

et créez une méthode get:

public String getLastDirectoryName(Path directoryPath) {
   int nameCount = directoryPath.getNameCount();
   return directoryPath.getName(nameCount - 1);
}

0

Dans Groovy:

Il n'est pas nécessaire de créer une Fileinstance pour analyser la chaîne dans groovy. Cela peut être fait comme suit:

String path = "C:/aaa/bbb/ccc/ddd/test.java"
path.split('/')[-2]  // this will return ddd

Le fractionnement créera le tableau [C:, aaa, bbb, ccc, ddd, test.java]et l'index -2pointera vers l'entrée avant le dernier, qui dans ce cas estddd


0
    //get the parentfolder name
    File file = new File( System.getProperty("user.dir") + "/.");
    String parentPath = file.getParentFile().getName();
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.