Files.walkFileTree复制,删除文件夹及其子文件夹

Files.walkFileTree的原理介绍
原型:static Path Files.walkFileTree(Path start, FileVisitor<? super Path> visitor);
ii. 表示从start代表的节点开始遍历文件系统;
iii. 其中visitor是遍历过程中的行为控制器;
4) 遍历行为控制器——FileVisitor:
i. 它是一个接口,里面定义了4个方法用来指定当你访问一个节点之前、之中、之后、失败时应该采取什么行动;
ii. 这个设计非常优雅和科学,毕竟你在遍历文件系统时想要做的事情无外乎发生在这几个时间点上,Java全部为你考虑好了,并搭好了框架!多么的贴心!!

public interface FileVisitor {

FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs) // 访问一个目录前要干啥
    throws IOException;

FileVisitResult postVisitDirectory(T dir, IOException exc) // 访问一个目录后要干啥
        throws IOException;

FileVisitResult visitFile(T file, BasicFileAttributes attrs) // 正在访问一个文件时要干啥
    throws IOException;

FileVisitResult visitFileFailed(T file, IOException exc) // 访问一个文件失败时要干啥
    throws IOException;

}

实际例子一:
// 发布站点版本的时候,将数据从Tomcat下复制到Nginx下
File nginxFolder = getStaticPagesFolderNginx(siteVersion);
File tomcatFolder = getStaticPagesFolderTomcat(siteVersion);
try {
Path source = Paths.get(tomcatFolder.toString());
Path target = Paths.get(nginxFolder.toString());
// 源文件夹非目录
if(null==source||!Files.isDirectory(source))
throw new IllegalArgumentException(“source must be directory”);
Files.walkFileTree(source, new SimpleFileVisitor () {

		            @Override
		            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
		                // 在目标文件夹中创建dir对应的子文件夹
		            	Path subDir =null;
		            	if (dir.compareTo(source) == 0) {
		            		subDir = target;
		            	} else {
		            		subDir = target.resolve(dir.subpath(source.getNameCount(), dir.getNameCount()));
		            	}

		                Files.createDirectories(subDir);			                	
		                return FileVisitResult.CONTINUE;
		            }

		            @Override
		            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
		            	Files.copy(file, target.resolve(file.subpath(source.getNameCount(), file.getNameCount())),StandardCopyOption.REPLACE_EXISTING);
		                return FileVisitResult.CONTINUE;
		            }
		        });
	} catch (IOException e) {
		e.printStackTrace();
	}

实际例子二:
try {
File eventFile = new File(eventService.getPublishPath());
if (!eventFile.exists()) {
return;
}
Files.walkFileTree(eventFile.toPath(), 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 {
					throw e;
				}
			}
		});
	} catch (Exception e) {
		e.printStackTrace();
	}

更多文章欢迎浏览博客:https://blog.csdn.net/qq_37022150

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Java 5递归遍历输出文件夹及其下文件名称的示例代码: ```java import java.io.File; public class FileTraversal { public static void traverseFiles(String path) { File folder = new File(path); if(folder.isDirectory()) { File[] files = folder.listFiles(); for(File file : files) { if(file.isDirectory()) { System.out.println("文件夹:" + file.getAbsolutePath()); traverseFiles(file.getAbsolutePath()); } else { System.out.println("文件:" + file.getAbsolutePath()); } } } else { System.out.println("输入的路径不是一个有效的文件夹!"); } } public static void main(String[] args) { String path = "D:/test"; traverseFiles(path); } } ``` 在这个示例中,我们先定义了一个名为“traverseFiles”的静态方法,用于递归遍历文件夹及其下文件名称。该方法接受一个字符串类型的参数“path”,表示要遍历的文件夹路径。 在方法内部,我们首先创建一个File对象,用于表示输入的路径。然后判断该路径是否是一个文件夹,如果不是,则输出一条错误信息。如果是文件夹,则调用File对象的listFiles()方法,获取该文件夹下的所有文件和文件夹。 接下来,我们使用for-each循环遍历这些文件和文件夹。如果当前项是一个文件夹,则输出该文件夹的绝对路径,并递归调用“traverseFiles”方法,以便继续遍历该文件夹及其下的文件。如果当前项是一个文件,则输出该文件的绝对路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值