Javaでファイルやフォルダを削除するにはどうすればよいですか?

王林
リリース: 2023-04-19 14:46:13
転載
2888 人が閲覧しました

    ファイルまたはフォルダーを削除する 4 つの基本的な方法

    次の 4 つの方法はいずれもファイルまたはフォルダーを削除できます。

    これらの共通点は次のとおりです。

    フォルダーにサブファイルが含まれている場合、削除は失敗します。つまり、これら 4 つの方法では空のフォルダーしか削除できません。

    //delete はすぐに削除を実行するのに対し、deleteOnExit は仮想マシンの終了時にプログラムを削除します。

    delete() of File class

    • deleteOnExit() of File class: 仮想マシンの終了時に削除File オブジェクトによって表されるファイルまたはディレクトリ。ディレクトリを表す場合は、そのディレクトリが空であることを確認する必要があります。そうでない場合は削除できず、戻り値はありません。

    • Files.delete(Path path): パラメータとして渡されたパス上にあるファイルを削除します。他のファイル システム操作の場合、このメソッドはアトミックではない可能性があります。ファイルがシンボリック リンクの場合、リンクの最終ターゲットではなく、シンボリック リンク自体が削除されます。ファイルがディレクトリの場合、このメソッドはディレクトリが空の場合にのみファイルを削除します。

    Files.deleteIfExists(Path path)
    ログイン後にコピー

    次の点に注意してください:

    従来の IO の File クラスと NIO の Path クラスは、ファイルとフォルダーの両方を表すことができます。

    #上記 4 つのメソッドの簡単な比較
    -説明成功の戻り値フォルダが存在しないと判断して失敗するかどうか##delete(file クラスの)従来の IO## ファイル クラスの DeleteOnExit() #従来の IO、これは落とし穴です。使用は避けてくださいvoid使用できませんが、存在しないため、削除は実行されませんCannot (return void)Files.delete(Path path)NIO、それvoidNoSuchFileExceptionDirectoryNotEmptyExceptionFiles.deleteIfExists(Path path) を使用することをお勧めします。 NIOtruefalseDirectoryNotEmptyException##File.delete() と Files.delete(Path path の比較) )違い:
    ##フォルダが空でないと判断して失敗するかどうか
    trueできません (false を返す)できません (false を返す)
    //删除暂存的pdf
    File file =new File(pdfFilename);
    file.delete();
    
    Path path4 = Paths.get(pdfFilename);
    Files.delete(path4);
    ログイン後にコピー
    -

    -File.delete()Files.delete(パス パス)JDK1.0JDK1.7java.nio.file.Files クラスの静的メソッドjava.nio.file.Pathvoid#例外宣言宣言がありませんjava.io.IOExceptionをスローするステートメントファイルが存在しません例外をスローせず、false を返しますjava.nio.file.NoSuchFileExceptionをスローします空でないディレクトリを削除します削除できません。 return false削除できません、java.nio.file.DirectoryNotEmptyExceptionをスローします占有されているファイルを削除します削除できません、falseを返します削除できません。java.nio.file.FileSystemException をスローします。ファイルは他の理由で削除できません。例外をスローしないで、false を返します。java.io.IOException の特定のサブクラスをスローする
    JDK
    Sourcejava.io.File オブジェクトのインスタンス メソッド
    Parametersパラメータなし
    戻り値boolean
    ##

    如何删除整个目录或者目录中的部分文件

    先造数据

    private  void createMoreFiles() throws IOException {
       Files.createDirectories(Paths.get("D:\data\test1\test2\test3\test4\test5\"));
       Files.write(Paths.get("D:\data\test1\test2\test2.log"), "hello".getBytes());
       Files.write(Paths.get("D:\data\test1\test2\test3\test3.log"), "hello".getBytes());
    }
    ログイン後にコピー
    walkFileTree与FileVisitor

    使用walkFileTree方法遍历整个文件目录树,使用FileVisitor处理遍历出来的每一项文件或文件夹

    • FileVisitor的visitFile方法用来处理遍历结果中的“文件”,所以我们可以在这个方法里面删除文件

    • FileVisitor的postVisitDirectory方法,注意方法中的“post”表示“后去做……”的意思,所以用来文件都处理完成之后再去处理文件夹,所以使用这个方法删除文件夹就可以有效避免文件夹内容不为空的异常,因为

    在去删除文件夹之前,该文件夹里面的文件已经被删除了。

    @Test
    void testDeleteFileDir5() throws IOException {
       createMoreFiles();
       Path path = Paths.get("D:\data\test1\test2");
    
       Files.walkFileTree(path,
          new SimpleFileVisitor<Path>() {
             // 先去遍历删除文件
             @Override
             public FileVisitResult visitFile(Path file,
                                      BasicFileAttributes attrs) throws IOException {
                Files.delete(file);
                System.out.printf("文件被删除 : %s%n", file);
                return FileVisitResult.CONTINUE;
             }
             // 再去遍历删除目录
             @Override
             public FileVisitResult postVisitDirectory(Path dir,
                                             IOException exc) throws IOException {
                Files.delete(dir);
                System.out.printf("文件夹被删除: %s%n", dir);
                return FileVisitResult.CONTINUE;
             }
    
          }
       );
    
    }
    ログイン後にコピー

    下面的输出体现了文件的删除顺序

    文件被删除 : D:\data\test1\test2\test2.log

    文件被删除 : D:\data\test1\test2\test3\test3.log

    文件夹被删除 : D:\data\test1\test2\test3\test4\test5

    文件夹被删除 : D:\data\test1\test2\test3\test4

    文件夹被删除 : D:\data\test1\test2\test3

    文件夹被删除 : D:\data\test1\test2

    我们既然可以遍历出文件夹或者文件,我们就可以在处理的过程中进行过滤。比如:

    按文件名删除文件或文件夹,参数Path里面含有文件或文件夹名称

    按文件创建时间、修改时间、文件大小等信息去删除文件,参数BasicFileAttributes 里面包含了这些文件信息。

    Files.walk

    如果你对Stream流语法不太熟悉的话,这种方法稍微难理解一点,但是说实话也非常简单。

    使用Files.walk遍历文件夹(包含子文件夹及子其文件),遍历结果是一个Stream

    对每一个遍历出来的结果进行处理,调用Files.delete就可以了。

    @Test
    void testDeleteFileDir6() throws IOException {
       createMoreFiles();
       Path path = Paths.get("D:\data\test1\test2");
    
       try (Stream<Path> walk = Files.walk(path)) {
          walk.sorted(Comparator.reverseOrder())
             .forEach(DeleteFileDir::deleteDirectoryStream);
       }
    
    }
    
    private static void deleteDirectoryStream(Path path) {
       try {
          Files.delete(path);
          System.out.printf("删除文件成功:%s%n",path.toString());
       } catch (IOException e) {
          System.err.printf("无法删除的路径 %s%n%s", path, e);
       }
    }
    ログイン後にコピー

    问题:怎么能做到先去删除文件,再去删除文件夹?

    利用的是字符串的排序规则,从字符串排序规则上讲,“D:\data\test1\test2”一定排在“D:\data\test1\test2\test2.log”的前面。

    所以我们使用“sorted(Comparator.reverseOrder())”把Stream顺序颠倒一下,就达到了先删除文件,再删除文件夹的目的。

    下面的输出,是最终执行结果的删除顺序。

    删除文件成功:D:\data\test1\test2\test3\test4\test5

    删除文件成功:D:\data\test1\test2\test3\test4

    删除文件成功:D:\data\test1\test2\test3\test3.log

    删除文件成功:D:\data\test1\test2\test3

    删除文件成功:D:\data\test1\test2\test2.log

    删除文件成功:D:\data\test1\test2

    传统IO-递归遍历删除文件夹

    传统的通过递归去删除文件或文件夹的方法就比较经典了

    //传统IO递归删除
    @Test
    void testDeleteFileDir7() throws IOException {
       createMoreFiles();
       File file = new File("D:\data\test1\test2");
       deleteDirectoryLegacyIO(file);
    
    }
    
    private void deleteDirectoryLegacyIO(File file) {
    
       File[] list = file.listFiles();  //无法做到list多层文件夹数据
       if (list != null) {
          for (File temp : list) {     //先去递归删除子文件夹及子文件
             deleteDirectoryLegacyIO(temp);   //注意这里是递归调用
          }
       }
    
       if (file.delete()) {     //再删除自己本身的文件夹
          System.out.printf("删除成功 : %s%n", file);
       } else {
          System.err.printf("删除失败 : %s%n", file);
       }
    }
    ログイン後にコピー

    需要注意的是:

    listFiles()方法只能列出文件夹下面的一层文件或文件夹,不能列出子文件夹及其子文件。

    先去递归删除子文件夹,再去删除文件夹自己本身。

    以上がJavaでファイルやフォルダを削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    関連ラベル:
    ソース:yisu.com
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート