特定のファイルの親ディレクトリ名のみを取得する方法


111

dddtest.javaが存在するパス名から取得する方法。

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

1
これは一般的なファイル用ですか、それともソースファイルの親ディレクトリを取得しようとしていますか?後者の場合、Javaコンパイルを理解しているかどうかはわかりません。実行時には、test.javaおそらくプログラムが実行されているコンピューター上に存在しません。実行されるのはコンパイルされた.classファイルです。したがって、これはddd、場所がわかっている場合にのみ機能します。その場合、プログラムで検索しても意味がありません。ただハードコーディングしてください。
Mark Peters、

回答:


141

使用FilegetParentFile()方法およびString.lastIndexOf()取得するためだけの直接の親ディレクトリを。

マークさんのコメントは、より優れたソリューションですlastIndexOf()

file.getParentFile().getName();

これらのソリューションは、ファイルに親ファイルがある場合にのみ機能します(たとえば、親をとるファイルコンストラクターの1つを介して作成されるFile)。ときにgetParentFile()あなたが使用してに頼る必要がありますnullの場合lastIndexOf、または使用のようなものApacheのコモンズのFileNameUtils.getFullPath()

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

接頭辞と末尾のセパレータを保持/削除するいくつかのバリアントがあります。同じFilenameUtilsクラスを使用して結果から名前を取得するかlastIndexOf、などを使用できます。


14
必要ありませんlastIndexOf、使用してくださいfile.getParentFile().getName()
Mark Peters

13
念のため。返さnullれたFile場合(相対パスでインスタンスを作成した場合)-を試してくださいfile.getAbsoluteFile().getParentFile().getName()
nidu 2012

1
@MarkPetersこれは、ファイルが親ファイルで作成された場合にのみ機能しますが、これは比較的まれです。
デイブニュートン

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

f.getParentFile() nullの可能性があるため、チェックする必要があります。


1
念のため、出力は次のようになります。C:/ aaa / bbb / ccc / ddd
Guy Avraham

16

以下を使用して、

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

基になるファイルに親セットがない場合でも、このメソッドには親セットが必要であることを指摘する価値があります。
2015

13

Java 7では、新しいPaths APIがあります。モダンでクリーンなソリューションは次のとおりです。

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

結果は次のようになります:

C:/aaa/bbb/ccc/ddd

5

文字列パスだけがあり、新しいFileオブジェクトを作成したくない場合は、次のようなものを使用できます。

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
ルートの場所にすでにいる場合、これはArrayOutOfBoundsExceptionをスローします-"/"
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"

別のパスを使用してフォルダ「ddd」を追加する必要がある場合。

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

1

Java 7以降では、Pathを使用したいと思います。あなただけにパスを入れる必要があります:

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

そしていくつかのgetメソッドを作成します:

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

0

Groovyの場合:

Filegroovyで文字列を解析するためにインスタンスを作成する必要はありません。次のように実行できます。

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

分割により配列が作成され、[C:, aaa, bbb, ccc, ddd, test.java]インデックス-2は最後の配列の前のエントリを指します。この場合はddd


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.