Java 11中FileVisitor接口如何使用来遍历文件系统,实现文件操作?
- 内容介绍
- 文章标签
- 相关推荐
本文共计673个文字,预计阅读时间需要3分钟。
pythondef delete_directory(file_visitor): from os import walk, remove, path
for root, dirs, files in walk('.'): for name in dirs: dir_path=path.join(root, name) if file_visitor.accept_directory(dir_path): remove(dir_path)
class FileVisitor: def accept_directory(self, directory): return True
用法示例file_visitor=FileVisitor()delete_directory(file_visitor)
文件的访问者。该接口的实现被提供给Files.walkFileTree方法以访问文件树中的每个文件。用法示例假设我们要删除文件树。在这种情况下删除目文件的访问者。
该接口的实现被提供给Files.walkFileTree方法以访问文件树中的每个文件。
用法示例假设我们要删除文件树。 在这种情况下删除目录中的条目后应删除每个目录。
Path start ...
Files.walkFileTree(start, new SimpleFileVisitor() {
Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException
{
Files.delete(file);
return FileVisitResult.CONTINUE;
}
Override
public FileVisitResult postVisitDirectory(Path dir, IOException e)
throws IOException
{
if (e null) {
Files.delete(dir);
return FileVisitResult.CONTINUE;
} else {
// directory iteration failed
throw e;
}
}
});
此外假设我们要将文件树复制到目标位置。 在这种情况下应遵循符号链接并且应在复制目录中的条目之前创建目标目录。
final Path source ...
final Path target ...
Files.walkFileTree(source, EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE,
new SimpleFileVisitor() {
Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
throws IOException
{
Path targetdir target.resolve(source.relativize(dir));
try {
Files.copy(dir, targetdir);
} catch (FileAlreadyExistsException e) {
if (!Files.isDirectory(targetdir))
throw e;
}
return CONTINUE;
}
Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException
{
Files.copy(file, target.resolve(source.relativize(file)));
return CONTINUE;
}
});
在目录中的条目及其所有后代访问后为目录调用。
在访问目录中的条目之前为目录调用。
为目录中的文件调用。
为无法访问的文件调用。
在访问目录中的条目之前为目录调用。
如果此方法返回CONTINUE 则访问该目录中的条目。 如果此方法返回SKIP_SUBTREE或SKIP_SIBLINGS则不会访问目录中的条目(以及任何后代)。
为目录中的文件调用。
为无法访问的文件调用。
如果无法读取文件的属性文件是无法打开的目录以及其他原因则调用此方法。
在目录中的条目及其所有后代访问后为目录调用。
当目录的迭代过早完成时(通过visitFile方法返回SKIP_SIBLINGS 或者在迭代目录时发生I / O错误)也会调用此方法。
本文共计673个文字,预计阅读时间需要3分钟。
pythondef delete_directory(file_visitor): from os import walk, remove, path
for root, dirs, files in walk('.'): for name in dirs: dir_path=path.join(root, name) if file_visitor.accept_directory(dir_path): remove(dir_path)
class FileVisitor: def accept_directory(self, directory): return True
用法示例file_visitor=FileVisitor()delete_directory(file_visitor)
文件的访问者。该接口的实现被提供给Files.walkFileTree方法以访问文件树中的每个文件。用法示例假设我们要删除文件树。在这种情况下删除目文件的访问者。
该接口的实现被提供给Files.walkFileTree方法以访问文件树中的每个文件。
用法示例假设我们要删除文件树。 在这种情况下删除目录中的条目后应删除每个目录。
Path start ...
Files.walkFileTree(start, new SimpleFileVisitor() {
Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException
{
Files.delete(file);
return FileVisitResult.CONTINUE;
}
Override
public FileVisitResult postVisitDirectory(Path dir, IOException e)
throws IOException
{
if (e null) {
Files.delete(dir);
return FileVisitResult.CONTINUE;
} else {
// directory iteration failed
throw e;
}
}
});
此外假设我们要将文件树复制到目标位置。 在这种情况下应遵循符号链接并且应在复制目录中的条目之前创建目标目录。
final Path source ...
final Path target ...
Files.walkFileTree(source, EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE,
new SimpleFileVisitor() {
Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
throws IOException
{
Path targetdir target.resolve(source.relativize(dir));
try {
Files.copy(dir, targetdir);
} catch (FileAlreadyExistsException e) {
if (!Files.isDirectory(targetdir))
throw e;
}
return CONTINUE;
}
Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException
{
Files.copy(file, target.resolve(source.relativize(file)));
return CONTINUE;
}
});
在目录中的条目及其所有后代访问后为目录调用。
在访问目录中的条目之前为目录调用。
为目录中的文件调用。
为无法访问的文件调用。
在访问目录中的条目之前为目录调用。
如果此方法返回CONTINUE 则访问该目录中的条目。 如果此方法返回SKIP_SUBTREE或SKIP_SIBLINGS则不会访问目录中的条目(以及任何后代)。
为目录中的文件调用。
为无法访问的文件调用。
如果无法读取文件的属性文件是无法打开的目录以及其他原因则调用此方法。
在目录中的条目及其所有后代访问后为目录调用。
当目录的迭代过早完成时(通过visitFile方法返回SKIP_SIBLINGS 或者在迭代目录时发生I / O错误)也会调用此方法。

