欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[NIO.2] 第三十五篇 编写一个文件删除应用

程序员文章站 2022-03-02 11:16:30
...
如果要删除单个文件,可以直接调用 delete() 或 deleteIfExists() 方法,它们会将文件从文件系统中删除。如果要删除目录树,则是通过  FileVisitor 的具体实现来递归调用 delete() 或 deleteIfExists() 方法。在开始之前,要注意以下原则:

  •     在删除目录之前,要确保目录是空的。
  •     删除文件最好在 visitFile() 方法中。
  •     最好在  postVisitDirectory() 方法中删除目录。
  •     如果文件不允许访问,那么 visitFileFailed() 方法需要返回 FileVisitResult.CONTINUE 或 TERMINATE,具体返回什么由你的需求决定。
  •     删除操作可以删除软链接的目标文件,但是如果目标文件在我们删除的目录树范围之外,那么不建议这么做。


下面的代码将递归删除整个  C:\rafaelnadal 目录:

import java.io.IOException; 
import java.nio.file.FileVisitOption; 
import java.nio.file.FileVisitResult; 
import java.nio.file.FileVisitor; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.attribute.BasicFileAttributes; 
import java.util.EnumSet; 
class DeleteDirectory implements FileVisitor {     
 
 boolean deleteFileByFile(Path file) throws IOException { 
    return Files.deleteIfExists(file); 
 } 
 
 @Override 
 public FileVisitResult postVisitDirectory(Object dir, IOException exc)  
                                                                  throws IOException { 
 
    if (exc == null) { 
        System.out.println("Visited: " + (Path) dir); 
        boolean success = deleteFileByFile((Path) dir); 
 
        if (success) { 
             System.out.println("Deleted: " + (Path) dir); 
        } else { 
              System.out.println("Not deleted: " + (Path) dir); 
        } 
    } else { 
        throw exc; 
    } 
    return FileVisitResult.CONTINUE; 
 } 
 
 @Override 
 public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs)  
                                                                  throws IOException { 
   return FileVisitResult.CONTINUE;  
 } 
 
 @Override 
 public FileVisitResult visitFile(Object file, BasicFileAttributes attrs)  
                                                                  throws IOException { 
   boolean success = deleteFileByFile((Path) file); 
 
   if (success) { 
        System.out.println("Deleted: " + (Path) file); 
   } else { 
        System.out.println("Not deleted: " + (Path) file); 
   } 
 
   return FileVisitResult.CONTINUE; 
 } 
 
 @Override 
 public FileVisitResult visitFileFailed(Object file, IOException exc)  
                                                                  throws IOException { 
   //report an error if necessary 
 
   return FileVisitResult.CONTINUE; 
 } 
} 
 
class Main { 
 
 public static void main(String[] args) throws IOException { 
 
   Path directory = Paths.get("C:/rafaelnadal"); 
   DeleteDirectory walk = new DeleteDirectory(); 
   EnumSet opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS); 
 
   Files.walkFileTree(directory, opts, Integer.MAX_VALUE, walk);        
   } 
} 


文章来源:http://www.aptusource.org/2014/04/nio-2-writing-a-file-delete-application/


相关标签: Java NIO.2