15

既存のファイルが特定のディレクトリまたはそのサブディレクトリにあるかどうかを確認したいと思います。

2 つのファイル オブジェクトがあります。

File dir;
File file;

どちらも存在することが保証されています。仮定しましょう

dir  = /tmp/dir 
file = /tmp/dir/subdir1/subdir2/file.txt

このチェックで true を返したい

今のところ、私はこの方法でチェックを行っています:

String canonicalDir = dir.getCanonicalPath() + File.separator;
boolean subdir = file.getCanonicalPath().startsWith(canonicalDir);

これは私の限られたテストでは機能するようですが、一部のオペレーティング システムで問題が発生するかどうかはわかりません。getCanonicalPath() が処理しなければならない IOException をスローできることも気に入りません。

より良い方法はありますか?おそらくどこかの図書館に?

ありがとう

4

9 に答える 9

14

Rocketboy からの回答に加えて、use getCanonicalPath()instad of getAbsolutePath()so\dir\dir2\..\fileは次のように変換され\dir\fileます。

    boolean areRelated = file.getCanonicalPath().contains(dir.getCanonicalPath() + File.separator);
    System.out.println(areRelated);

また

boolean areRelated = child.getCanonicalPath().startsWith(parent.getCanonicalPath() + File.separator);

Exceptionでキャッチすることを忘れないでくださいtry {...} catch {...}

注:FileSystem.getSeparator()の代わりに使用できますFile.separator。これを行う「正しい」方法は、getCanonicalPath()チェックするディレクトリの を として取得し、 でString終わっているかどうかを確認し、そうでない場合はその の最後にFile.separator追加して、二重スラッシュを避けることです。このようにして、Java が末尾にスラッシュを含むディレクトリを返すことを決定した場合、またはディレクトリ文字列が 以外の場所から取得された場合に、将来の奇妙な動作をスキップします。File.separatorStringJava.io.File

注2:問題を指摘してくれた@davidに感謝しFile.separatorます。

于 2014-04-12T12:21:25.843 に答える
8

この方法はかなり堅実に見えます:

/**
 * Checks, whether the child directory is a subdirectory of the base 
 * directory.
 *
 * @param base the base directory.
 * @param child the suspected child directory.
 * @return true, if the child is a subdirectory of the base directory.
 * @throws IOException if an IOError occured during the test.
 */
public boolean isSubDirectory(File base, File child)
    throws IOException {
    base = base.getCanonicalFile();
    child = child.getCanonicalFile();

    File parentFile = child;
    while (parentFile != null) {
        if (base.equals(parentFile)) {
            return true;
        }
        parentFile = parentFile.getParentFile();
    }
    return false;
}

ソース

これは dacwe によるソリューションに似ていますが、再帰を使用していません (ただし、この場合は大きな違いはありません)。

于 2014-07-30T11:56:14.343 に答える
1

ファイルとファイル名を扱う予定がある場合は、apache fileutils と filenameutils ライブラリをよく確認してください。便利な機能 (および移植性が必須の場合はポータル機能) が満載です

于 2013-08-14T09:29:20.417 に答える
0

特定の DIR から開始してファイル ツリーをトラバースできます。Java 7 では、Files.walkFileTreeメソッドがあります。現在のノードがファイルを検索されているかどうかを確認するには、独自のビジターを作成するだけです。その他のドキュメント: http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#walkFileTree%28java.nio.file.Path,%20java.util.Set,%20int ,%20java.nio.file.FileVisitor%29

于 2013-08-14T09:38:21.787 に答える
0
public class Test {
public static void main(String[] args) {
    File root = new File("c:\\test");
    String fileName = "a.txt";
    try {
        boolean recursive = true;

        Collection files = FileUtils.listFiles(root, null, recursive);

        for (Iterator iterator = files.iterator(); iterator.hasNext();) {
            File file = (File) iterator.next();
            if (file.getName().equals(fileName))
                System.out.println(file.getAbsolutePath());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

于 2013-08-14T09:29:36.237 に答える
0

Java 7以降では、これを行うことができます:

file.toPath().startsWith(dir.toPath());
于 2022-02-07T12:08:08.930 に答える