我正在尝试在硬盘中搜索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;
}
}
}
答案 0 :(得分:0)
你必须覆盖两种方法。
正如文件所述:
除非被覆盖,否则此方法会重新抛出阻止文件被访问的I / O异常。
您还必须覆盖postVisitDirectory()
method;它有两个参数,第二个是IOException
。如果有错误,第二个参数将不为null,在这种情况下,再次从文档中获取:
除非重写,否则如果目录迭代完成而没有I / O异常,则此方法返回CONTINUE;否则此方法会重新抛出导致目录迭代过早终止的I / O异常。
鉴于您的错误,第二个是您要覆盖的错误。
但是,我在您的代码中看到您执行了file.toFile().renameTo()
。
不要使用它。请改用Files.move()
。
最后,你在迭代时也会移动......这不是一个好主意。回想一下,例如,与旧API不同,目录中的文件列表是动态填充的!
您应该创建一个“重命名”Map<Path, Path>
并在访问完所有内容后执行重命名。至少这就是我在这种情况下的表现。