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");
minil
la source
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.

Dave Newton
la source
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.

Surasin Tancharoen
la source
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();
Ishan Liyanage
la source
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
neves
la source
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));
}
Fedir Tsapana
la source
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();
Crni03
la source
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);
}
Peter S.
la source
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

yamenk
la source
0
    //get the parentfolder name
    File file = new File( System.getProperty("user.dir") + "/.");
    String parentPath = file.getParentFile().getName();
Oscar Betgen
la source