【问题标题】:Java SimpleFileVisitor Issue when encountering permission errors遇到权限错误时的 Java SimpleFileVisitor 问题
【发布时间】:2017-01-16 05:33:04
【问题描述】:

我正在尝试在我的硬盘上搜索 mp4 文件并将它们复制到特定文件夹中。问题是我没有权限访问像:"C:\Documents and Settings" 这样的文件夹,所以我的程序在遇到这些文件夹时会停止,而不是继续。

我试图创建一个黑名单,但它根本不起作用。

package S;

import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;

    public class C {
        public static void main(String args[]) throws IOException {
            Path dir = Paths.get("C:/");
        Files.walkFileTree(dir, new FindJavaVisitor());
    }

    private static class FindJavaVisitor extends SimpleFileVisitor<Path> {

        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
            if (file.toString().contains(".mp4")) {
                file.toFile().renameTo(new File("C:/MP4/"+file.toFile().getName()));
            }
            return FileVisitResult.CONTINUE;
        }
    }
}

【问题讨论】:

    标签: java hdd simplefilevisitor


    【解决方案1】:

    你必须重写两个方法。

    第一个是visitFileFailed() method

    如文档所述:

    除非被覆盖,否则此方法会重新引发阻止文件被访问的 I/O 异常。

    您还必须覆盖postVisitDirectory() method;它有两个参数,第二个是IOException。如果有错误,第二个参数将不为空,在这种情况下,再次来自文档:

    除非被重写,否则如果目录迭代完成且没有 I/O 异常,则此方法返回 CONTINUE;否则此方法会重新抛出导致目录迭代提前终止的 I/O 异常。

    鉴于您的错误,第二个是您要覆盖的错误。

    但是,我在您的代码中看到您执行file.toFile().renameTo()

    不要使用这个。请改用Files.move()


    最后,你在迭代的同时也移动......这不是一个好主意。例如,目录中的文件列表与旧 API 不同,它是动态填充的!

    您应该创建一个“重命名”Map&lt;Path, Path&gt; 并在访问完所有内容后执行重命名。至少在这种情况下我会这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      相关资源
      最近更新 更多