• Java NIO.2 —— 文件或目录删除操作


    文件删除

      删除单个文件的操作很简单,如果要删除一个目录树的话,需要实现FileVisitor 接口然后递归地调用delete()deleteIfExists()方法。在看代码之前,需要注意一下问题。

    • 在删除一个目录之前,要先删除里面的文件。
    • visitFile()方式是执行删除每个文件最好的方式。
    • 因为只有在目录为空的情况下才可以删除,所以建议在postVisitDirectory()方法中删除目录操作。
    • 如果文件不允许访问,你可以根据自己的决定使用visitFileFailed()方法来返回FileVisitResult.CONTINUETERMINATE
    • 删除过程可以跟踪符号链接文件,但是这不是一个可取的方式。因为符号链接可能指向超过删除域之外的文件。如果你能确认这种情况不会发生,或是还有其他约束条件阻止此情况发生,那么你可以跟踪符号链接文件。

      下面的程序用来删除C: afaelnadal目录下所有的目录和文件。

    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);       
       }
     }
  • 相关阅读:
    第二十二篇、服务器返回的数据转成模型
    第二十一篇、广告轮播器(支持循环滚动)
    【转】android应用程序的安装方式与原理
    【转】Android中处理崩溃异常
    android在Data目录内置可删除的APP
    Ubuntu下修改system.img 解包system.img、打包system.img
    Android studio打包APK混淆配置
    Android获取焦点所在控件
    Android根据APP包名启动应用
    Android自动更新安装后显示‘完成’‘打开’按钮
  • 原文地址:https://www.cnblogs.com/IcanFixIt/p/4919702.html
Copyright © 2020-2023  润新知