1

こんにちは、Java を使用して多くのサブディレクトリ内のファイルを処理したいと考えています。疑似コードは

while(mainDir.hasMoreDirectory())
{
   getFilesFromCurrentDirectory()
   passThoseFilesAsArgumentToProcess()
}

現在、次のコードを使用しています

public void list(File file) {
    System.out.println(file.getName());
    File[] children = file.listFiles();
    for (File child : children) {
        list(child);
    }
}

上記のコードはファイルをリストするだけです。他にできることは、ファイルとディレクトリのリストをリストに保存してから、別のループで処理することです。しかし、疑似コードで表示したいものを思いつくことができません。私はファイル ディレクトリを初めて使用します。助けてください。前もって感謝します。

4

6 に答える 6

1

Java 7 でディレクトリ ツリーを移動する場合は、PathsandFiles機能を使用します。ディレクトリとファイルの読み取りを容易にするだけでなく、「古い」方法よりもはるかに高速ですFile

2 つのディレクトリがあるとします: mainDirandと のすべてのディレクトリをそのリーフまでotherDirたどりたいとします。(ファイル、サブディレクトリ、シンボリック リンク、...)mainDir内の各エントリを使用して、このエントリとその属性 (サイズ、変更時間など) を .xml ファイル内の同じ位置にあるエントリと比較します。次に、これはあなたのコードになります:maiondirotherDir

public final void test() throws IOException, InterruptedException {
    final Path mainDir = Paths.get("absolute path to your main directory to read from");
    final Path otherDir = Paths.get("absolute path to your other directory to compare");

    // Walk thru mainDir directory
    Files.walkFileTree(mainDir, new FileVisitor<Path>() {
        @Override
        public FileVisitResult preVisitDirectory(Path path,
                BasicFileAttributes atts) throws IOException {
            return visitFile(path, atts);
        }

        @Override
        public FileVisitResult visitFile(Path path, BasicFileAttributes mainAtts)
                throws IOException {
            // I've seen two implementations on windows and MacOSX. One has passed the relative path, one the absolute path.
            // This works in both cases
            Path relativePath = mainDir.relativize(mainDir.resolve(path));

            BasicFileAttributes otherAtts = Files.readAttributes(otherDir.resolve(relativePath), BasicFileAttributes.class);

            // Do your comparison logic here:
            compareEntries(mainDir, otherDir, relativePath, mainAtts, otherAtts);

            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult postVisitDirectory(Path path,
                IOException exc) throws IOException {
            // TODO Auto-generated method stub
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path path, IOException exc)
                throws IOException {
            exc.printStackTrace();

            // If the root directory has failed it makes no sense to continue
            return (path.equals(mainDir))? FileVisitResult.TERMINATE:FileVisitResult.CONTINUE;
        }
    });
}

ないこと:

  • otherDirに存在するが存在しないエントリを検索maindir
  • Pathとは でBasicFileAttributesはないSerializableため、2 つの異なるマシンでこのウォークを実行する簡単な方法はありません。
于 2013-08-13T14:16:49.387 に答える
0

多分このコードはあなたを助けるでしょう:

public void traverse(String path) {
    File root = new File(path);
    File[] list = root.listFiles();
    if (list == null) return;

    for (File file : list) {
        if (file.isDirectory()) {
            traverse(file.getAbsolutePath());
            System.out.println("Directory: " + file.getAbsoluteFile());
        } else {
            System.out.println("File: " + file.getAbsoluteFile());
        }
    }
}
于 2013-08-13T12:36:33.457 に答える
0
private static List<File> allFiles = new ArrayList<File>();

private static void processFiles(String rootDirectory) {
    File rootDir = new File(rootDirectory);
    if (rootDir.exists()) {
        traverseDirectories(rootDir);
    }
}

private static void traverseDirectories(File file) {
    // add all files and directories to list.
    allFiles.add(file);
    if (file.isDirectory()) {
        File[] fileList = file.listFiles();
        for (File fileHandle : fileList) {
            traverseDirectories(fileHandle);
        }
    } else {
        // call to process file
        System.out.println("Call to process file " + file.getAbsolutePath());
    }
}
于 2013-08-13T12:40:06.693 に答える
0

次のようにしますか?

public void list(File file) {
    File[] children = file.listFiles();

    if (children != null) {
        process(children);

        for (File child : children) {
            if (child.isDirectory()) {
                list(child);
            }
        }
    } else {
        process(new File[]{file});
    }
}

private void process(File[] children) {
    for (File child : children) {
        if (child.isFile()) {
            // process normal file
        }
    }
}
于 2013-08-13T12:33:40.163 に答える
0

このようなメソッドはList、ディレクトリ内のすべてのファイルを再帰的に返します。返されたものを操作するか、呼び出しを処理にList置き換えることができます。rtn.add

このメソッドには、循環シンボリックリンクでスタックするのを止めるものがないことに注意してください。

public static List<File> getFilesRecursive(File s)
{
    ArrayList<File> rtn = new ArrayList<File>();
    File[] contents = s.listFiles();
    for(int i = 0; i<contents.length; i++)
    {
        if(contents[i].isDirectory()){
            rtn.addAll(getFilesRecursive(contents[i]));
        }else{
            rtn.add(contents[i]);
        }
    }
    return rtn;
}
于 2013-08-13T12:33:53.227 に答える