精华内容
下载资源
问答
  • 为了方便大家理解,我特意制作了本文对应的视频:总结删除文件或者文件夹的7种方法一、删除文件或文件夹的四种基础方法下面的四个方法都可以删除文件或文件夹,它们的共同点是:当文件夹中包含子文件的时候都会删除...

    c8810c7ad3723e76a82a1953bdcb0b75.png

    本文是Java IO总结系列篇的第4篇,前篇的访问地址如下:

    如果您阅读完成,觉得此文对您有帮助,请给我点个赞,您的支持是我不竭的创作动力。

    为了方便大家理解,我特意制作了本文对应的视频:总结删除文件或者文件夹的7种方法

    一、删除文件或文件夹的四种基础方法

    下面的四个方法都可以删除文件或文件夹,它们的共同点是:当文件夹中包含子文件的时候都会删除失败,也就是说这四个方法只能删除空文件夹。

    需要注意的是:传统IO中的File类和NIO中的Path类既可以代表文件,也可以代表文件夹。

    File类的delete()

    File类的deleteOnExit()

    Files.delete(Path path)

    Files.deleteIfExists(Path path);

    它们之间的差异:

    f099e9fe1b12d5c82402b92e42a3f1b3.png

    由上面的对比可以看出,传统IO方法删除文件或文件夹,再删除失败的时候,最多返回一个false。通过这个false无法发掘删除失败的具体原因,是因为文件本身不存在删除失败?还是文件夹不为空导致的删除失败?

    NIO 的方法在这一点上,就做的比较好,删除成功或失败都有具体的返回值或者异常信息,这样有利于我们在删除文件或文件夹的时候更好的做程序的异常处理

    需要注意的是传统IO中的deleteOnExit方法,笔者觉得应该避免使用它。它永远只返回void,删除失败也不会有任何的Exception抛出,所以我建议不要用,以免在你删除失败的时候没有任何的响应,而你可能误以为删除成功了。

    //false只能告诉你失败了 ,但是没有给出任何失败的原因

    @Test

    void testDeleteFileDir1() {

    File file = new File("D:\\data\\test");

    boolean deleted = file.delete();

    System.out.println(deleted);

    }

    //void ,删除失败没有任何提示,应避免使用这个方法,就是个坑

    @Test

    void testDeleteFileDir2() {

    File file = new File("D:\\data\\test1");

    file.deleteOnExit();

    }

    //如果文件不存在,抛出NoSuchFileException

    //如果文件夹里面包含文件,抛出DirectoryNotEmptyException

    @Test

    void testDeleteFileDir3() throws IOException {

    Path path = Paths.get("D:\\data\\test1");

    Files.delete(path); //返回值void

    }

    //如果文件不存在,返回false,表示删除失败(文件不存在)

    //如果文件夹里面包含文件,抛出DirectoryNotEmptyException

    @Test

    void testDeleteFileDir4() throws IOException {

    Path path = Paths.get("D:\\data\\test1");

    boolean result = Files.deleteIfExists(path);

    System.out.println(result);

    }

    归根结底,建议大家使用java NIO的Files.delete(Path path)和Files.deleteIfExists(Path path);进行文件或文件夹的删除。

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

    上文已经说了,那四个API删除文件夹的时候,如果文件夹包含子文件,就会删除失败。那么,如果我们确实想删除整个文件夹,该怎么办?

    前提准备

    为了方便我们后面进行试验,先去创建这样一个目录结构,“.log”结尾的是数据文件,其他的是文件夹

    3a45c4e03569f81278f50d0a06cf8b3b.png

    可以使用代面的代码进行创建

    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());

    }

    2.1. 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() {

    // 先去遍历删除文件

    @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 里面包含了这些文件信息。

    2.2.Files.walk

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

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

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

    @Test

    void testDeleteFileDir6() throws IOException {

    createMoreFiles();

    Path path = Paths.get("D:\\data\\test1\\test2");

    try (Stream 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

    2.3.传统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()方法只能列出文件夹下面的一层文件或文件夹,不能列出子文件夹及其子文件。

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

    欢迎关注我的博客,里面有很多精品合集

    本文转载注明出处(必须带连接,不能只转文字):字母哥博客。

    觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

    展开全文
  • 为了方便大家理解,我特意制作了本文对应的视频:总结删除文件或者文件夹的7种方法一、删除文件或文件夹的四种基础方法下面的四个方法都可以删除文件或文件夹,它们的共同点是:当文件夹中包含子文件的时候都会删除...

    9e64cebfde3fdeb09ecdda837ebeee3e.png

    本文是Java IO总结系列篇的第4篇,前篇的访问地址如下:

    如果您阅读完成,觉得此文对您有帮助,请给我点个赞,您的支持是我不竭的创作动力。为了方便大家理解,我特意制作了本文对应的视频:总结删除文件或者文件夹的7种方法

    一、删除文件或文件夹的四种基础方法

    下面的四个方法都可以删除文件或文件夹,它们的共同点是:当文件夹中包含子文件的时候都会删除失败,也就是说这四个方法只能删除空文件夹。需要注意的是:传统IO中的File类和NIO中的Path类既可以代表文件,也可以代表文件夹。File类的delete()

    File类的deleteOnExit()

    Files.delete(Path path)

    Files.deleteIfExists(Path path);

    它们之间的差异:成功的返回值是否能判别文件夹不存在导致失败是否能判别文件夹不为空导致失败备注File类的delete()true不能(返回false)不能(返回false)传统IO

    File类的deleteOnExit()void不能,但不存在就不会去执行删除不能(返回void)传统IO,这是个坑,避免使用

    Files.delete(Path path)voidNoSuchFileExceptionDirectoryNotEmptyExceptionNIO,笔者推荐使用

    Files.deleteIfExists(Path path);truefalseDirectoryNotEmptyExceptionNIO由上面的对比可以看出,传统IO方法删除文件或文件夹,再删除失败的时候,最多返回一个false。通过这个false无法发掘删除失败的具体原因,是因为文件本身不存在删除失败?还是文件夹不为空导致的删除失败?

    NIO 的方法在这一点上,就做的比较好,删除成功或失败都有具体的返回值或者异常信息,这样有利于我们在删除文件或文件夹的时候更好的做程序的异常处理

    需要注意的是传统IO中的deleteOnExit方法,笔者觉得应该避免使用它。它永远只返回void,删除失败也不会有任何的Exception抛出,所以我建议不要用,以免在你删除失败的时候没有任何的响应,而你可能误以为删除成功了。//false只能告诉你失败了 ,但是没有给出任何失败的原因

    @Test

    void testDeleteFileDir1() {

    File file = new File("D:\\data\\test");

    boolean deleted = file.delete();

    System.out.println(deleted);

    }

    //void ,删除失败没有任何提示,应避免使用这个方法,就是个坑

    @Test

    void testDeleteFileDir2() {

    File file = new File("D:\\data\\test1");

    file.deleteOnExit();

    }

    //如果文件不存在,抛出NoSuchFileException

    //如果文件夹里面包含文件,抛出DirectoryNotEmptyException

    @Test

    void testDeleteFileDir3() throws IOException {

    Path path = Paths.get("D:\\data\\test1");

    Files.delete(path); //返回值void

    }

    //如果文件不存在,返回false,表示删除失败(文件不存在)

    //如果文件夹里面包含文件,抛出DirectoryNotEmptyException

    @Test

    void testDeleteFileDir4() throws IOException {

    Path path = Paths.get("D:\\data\\test1");

    boolean result = Files.deleteIfExists(path);

    System.out.println(result);

    }

    归根结底,建议大家使用java NIO的Files.delete(Path path)和Files.deleteIfExists(Path path);进行文件或文件夹的删除。

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

    上文已经说了,那四个API删除文件夹的时候,如果文件夹包含子文件,就会删除失败。那么,如果我们确实想删除整个文件夹,该怎么办?

    前提准备

    为了方便我们后面进行试验,先去创建这样一个目录结构,“.log”结尾的是数据文件,其他的是文件夹

    3df6398f8b244c2bc41c51e7ca0689d6.png

    可以使用代面的代码进行创建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());

    }

    2.1. 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() {

    // 先去遍历删除文件

    @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 里面包含了这些文件信息。

    2.2.Files.walk

    如果你对Stream流语法不太熟悉的话,这种方法稍微难理解一点,但是说实话也非常简单。使用Files.walk遍历文件夹(包含子文件夹及子其文件),遍历结果是一个Stream

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

    void testDeleteFileDir6() throws IOException {

    createMoreFiles();

    Path path = Paths.get("D:\\data\\test1\\test2");

    try (Stream 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:datatest1test2”一定排在“D:datatest1test2test2.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

    2.3.传统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 IO总结系列篇的第4篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据...一、删除文件或文件夹的四种基础方法 下面的四个方法都可以删除文件或文.

    本文是Java IO总结系列篇的第4篇,前篇的访问地址如下:

    如果您阅读完成,觉得此文对您有帮助,请给我点个赞,您的支持是我不竭的创作动力。

    为了方便大家理解,我特意制作了本文对应的视频:总结删除文件或者文件夹的7种方法

    一、删除文件或文件夹的四种基础方法

    下面的四个方法都可以删除文件或文件夹,它们的共同点是:当文件夹中包含子文件的时候都会删除失败,也就是说这四个方法只能删除空文件夹

    需要注意的是:传统IO中的File类和NIO中的Path类既可以代表文件,也可以代表文件夹。

    • File类的delete()
    • File类的deleteOnExit()
    • Files.delete(Path path)
    • Files.deleteIfExists(Path path);

    它们之间的差异:

    成功的返回值 是否能判别文件夹不存在导致失败 是否能判别文件夹不为空导致失败 备注
    File类的delete() true 不能(返回false) 不能(返回false) 传统IO
    File类的deleteOnExit() void 不能,但不存在就不会去执行删除 不能(返回void) 传统IO,这是个坑,避免使用
    Files.delete(Path path) void NoSuchFileException DirectoryNotEmptyException NIO,笔者推荐使用
    Files.deleteIfExists(Path path); true false DirectoryNotEmptyException NIO
    • 由上面的对比可以看出,传统IO方法删除文件或文件夹,再删除失败的时候,最多返回一个false。通过这个false无法发掘删除失败的具体原因,是因为文件本身不存在删除失败?还是文件夹不为空导致的删除失败?
    • NIO 的方法在这一点上,就做的比较好,删除成功或失败都有具体的返回值或者异常信息,这样有利于我们在删除文件或文件夹的时候更好的做程序的异常处理
    • 需要注意的是传统IO中的deleteOnExit方法,笔者觉得应该避免使用它。它永远只返回void,删除失败也不会有任何的Exception抛出,所以我建议不要用,以免在你删除失败的时候没有任何的响应,而你可能误以为删除成功了。
    //false只能告诉你失败了 ,但是没有给出任何失败的原因
    @Test
    void testDeleteFileDir1()  {
       File file = new File("D:\\data\\test");
       boolean deleted = file.delete();
       System.out.println(deleted);
    }
    
    //void ,删除失败没有任何提示,应避免使用这个方法,就是个坑
    @Test
    void testDeleteFileDir2()  {
       File file = new File("D:\\data\\test1");
       file.deleteOnExit();
    }
    
    
    //如果文件不存在,抛出NoSuchFileException
    //如果文件夹里面包含文件,抛出DirectoryNotEmptyException
    @Test
    void testDeleteFileDir3() throws IOException {
       Path path = Paths.get("D:\\data\\test1");
       Files.delete(path);   //返回值void
    }
    
    //如果文件不存在,返回false,表示删除失败(文件不存在)
    //如果文件夹里面包含文件,抛出DirectoryNotEmptyException
    @Test
    void testDeleteFileDir4() throws IOException {
       Path path = Paths.get("D:\\data\\test1");
       boolean result = Files.deleteIfExists(path);
       System.out.println(result);
    }

    归根结底,建议大家使用java NIO的Files.delete(Path path)Files.deleteIfExists(Path path);进行文件或文件夹的删除。

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

    上文已经说了,那四个API删除文件夹的时候,如果文件夹包含子文件,就会删除失败。那么,如果我们确实想删除整个文件夹,该怎么办?

    前提准备

    为了方便我们后面进行试验,先去创建这样一个目录结构,“.log”结尾的是数据文件,其他的是文件夹

    可以使用代面的代码进行创建

    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());
    }

    2.1. 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 里面包含了这些文件信息。

    2.2.Files.walk

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

    • 使用Files.walk遍历文件夹(包含子文件夹及子其文件),遍历结果是一个Stream<Path>
    • 对每一个遍历出来的结果进行处理,调用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

    2.3.传统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()方法只能列出文件夹下面的一层文件或文件夹,不能列出子文件夹及其子文件。

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

      欢迎关注我的博客,里面有很多精品合集

    • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客

    觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

    展开全文
  • 为了方便大家理解,我特意制作了本文对应的视频:总结删除文件或者文件夹的7种方法一、删除文件或文件夹的四种基础方法下面的四个方法都可以删除文件或文件夹,它们的共同点是:当文件夹中包含子文件的时候都会删除...

    5762123140579884566d5cdc67caadbb.png

    本文是Java IO总结系列篇的第4篇,前篇的访问地址如下:

    如果您阅读完成,觉得此文对您有帮助,请给我点个赞,您的支持是我不竭的创作动力。

    为了方便大家理解,我特意制作了本文对应的视频:总结删除文件或者文件夹的7种方法

    一、删除文件或文件夹的四种基础方法

    下面的四个方法都可以删除文件或文件夹,它们的共同点是:当文件夹中包含子文件的时候都会删除失败,也就是说这四个方法只能删除空文件夹。

    需要注意的是:传统IO中的File类和NIO中的Path类既可以代表文件,也可以代表文件夹。

    File类的delete()

    File类的deleteOnExit()

    Files.delete(Path path)

    Files.deleteIfExists(Path path);

    它们之间的差异:

    成功的返回值

    是否能判别文件夹不存在导致失败

    是否能判别文件夹不为空导致失败

    备注

    File类的delete()

    true

    不能(返回false)

    不能(返回false)

    传统IO

    File类的deleteOnExit()

    void

    不能,但不存在就不会去执行删除

    不能(返回void)

    传统IO,这是个坑,避免使用

    Files.delete(Path path)

    void

    NoSuchFileException

    DirectoryNotEmptyException

    NIO,笔者推荐使用

    Files.deleteIfExists(Path path);

    true

    false

    DirectoryNotEmptyException

    由上面的对比可以看出,传统IO方法删除文件或文件夹,再删除失败的时候,最多返回一个false。通过这个false无法发掘删除失败的具体原因,是因为文件本身不存在删除失败?还是文件夹不为空导致的删除失败?

    NIO 的方法在这一点上,就做的比较好,删除成功或失败都有具体的返回值或者异常信息,这样有利于我们在删除文件或文件夹的时候更好的做程序的异常处理

    需要注意的是传统IO中的deleteOnExit方法,笔者觉得应该避免使用它。它永远只返回void,删除失败也不会有任何的Exception抛出,所以我建议不要用,以免在你删除失败的时候没有任何的响应,而你可能误以为删除成功了。

    //false只能告诉你失败了 ,但是没有给出任何失败的原因

    @Test

    void testDeleteFileDir1() {

    File file = new File("D:\data\test");

    boolean deleted = file.delete();

    System.out.println(deleted);

    }

    //void ,删除失败没有任何提示,应避免使用这个方法,就是个坑

    @Test

    void testDeleteFileDir2() {

    File file = new File("D:\data\test1");

    file.deleteOnExit();

    }

    //如果文件不存在,抛出NoSuchFileException

    //如果文件夹里面包含文件,抛出DirectoryNotEmptyException

    @Test

    void testDeleteFileDir3() throws IOException {

    Path path = Paths.get("D:\data\test1");

    Files.delete(path); //返回值void

    }

    //如果文件不存在,返回false,表示删除失败(文件不存在)

    //如果文件夹里面包含文件,抛出DirectoryNotEmptyException

    @Test

    void testDeleteFileDir4() throws IOException {

    Path path = Paths.get("D:\data\test1");

    boolean result = Files.deleteIfExists(path);

    System.out.println(result);

    }

    归根结底,建议大家使用java NIO的Files.delete(Path path)和Files.deleteIfExists(Path path);进行文件或文件夹的删除。

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

    上文已经说了,那四个API删除文件夹的时候,如果文件夹包含子文件,就会删除失败。那么,如果我们确实想删除整个文件夹,该怎么办?

    前提准备

    为了方便我们后面进行试验,先去创建这样一个目录结构,“.log”结尾的是数据文件,其他的是文件夹

    569b5c1967520a67da1ddc02380eb943.png

    可以使用代面的代码进行创建

    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());

    }

    2.1. 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() {

    // 先去遍历删除文件

    @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 里面包含了这些文件信息。

    2.2.Files.walk

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

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

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

    @Test

    void testDeleteFileDir6() throws IOException {

    createMoreFiles();

    Path path = Paths.get("D:\data\test1\test2");

    try (Stream 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

    2.3.传统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()方法只能列出文件夹下面的一层文件或文件夹,不能列出子文件夹及其子文件。

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

    喜欢 (2)or分享 (0)

    展开全文
  • 1、将下面代码复制到记事本中,并另存为.bat文件,如HTMer_Del.bat(记事本保存为.bat文件的方法:记事本在另存为的时候选择“保存类型”为“所有文件”,文件名的扩展名为.bat) @ECHO OFF CLS ...
  • 使用ls -i命令找到文件或文件夹的节点编号 前面的就是节点号了,接下来使用find命令查询并且删除 -inum指根据节点号查询;-delete顾名思义就是删除操作了。这样就成功删除乱码文件了,值得注意的是,...
  • 总结java创建文件夹的4种方法及其优缺点-JAVA IO基础总结第三篇 如果您阅读完成,觉得此文对您有帮助,请给我点个赞,您的支持是我不竭的创作动力。 为了方便大家理解,我特意制作了本文对应的视...
  • 总结java创建文件夹的4种方法及其优缺点-JAVA IO基础总结第三篇 如果您阅读完成,觉得此文对您有帮助,请给我点个赞,您的支持是我不竭的创作动力。 为了方便大家理解,我特意制作了本文对应的视...
  • os.remove(path) 删除文件 path. 如果path是一个目录, 抛出 OSError错误。如果要删除目录,请使用rmdir(). remove() 同 unlink() 功能是一样 在Windows系统中,删除一个正在使用... #删除文件,可使用以下两种方法
  • 我是在卸载SQLServer2008最后一步,删除c盘下program Files下Microsoft SOL Server文件夹90文件夹时出现该错误。解决方案如下: 1.打开任务管理器,点击标题栏性能,在点击资源监视器,在标题栏里点击cpu...
  • 新建文本文档,复制以下内容并保存,后缀名...把无法删除的文件或文件夹拖到上面即可删除。 DEL /F /A /Q \\?\%1 RD /S /Q \\?\%1 后记:出现此情况多数是从Linux打包文件,在Windows下解压造成。 ...
  • /utils/removeDir.js是我存放这个方法的的js文件 app.js: const removeDir=require('./utils/removeDir'); removeDir('./rdir.html') removeDir.js文件: let fs = require('fs') const arrForEach= function ...
  • 1种: 超级删除批处理,建一个...使用方法就是把你想要删除的文件或文件夹往这个SuperDel.bat上放就OK了,有顽固可能需要重起才会被删除。 2种:也是建一个空白txt文件,名字自己定,把下面代码复制进去,...
  • 由于给本地项目配置远程库,误提交很多不应该提交的文件或文件夹,比如 .idea .settings .project .iml 以及日志等文件。以及由于 .gitignore 文件配置不正确很有可能导致某些不需要目录上传到 git 远程仓库上了。...
  • git删除远程文件夹或文件的方法

    千次阅读 2018-12-21 21:52:18
    由于本地修改了文件夹大全名大小写原因,同步到git上并不区分大小写,造成了一些文件同步不了,所以要先把git远程库上文件夹删除掉,然后再重新同步 如下,我把dirs里全部移除,但是本地文件还保留。 git rm -r ...
  • 本文是Java IO总结系列篇的第4篇,前篇的拜访地址如下:总结java中创立并写文件的5种形式-JAVA IO根底总结第一篇总结java从文件中读取数据的6种办法-JAVA IO根底总结第二篇总结java创立文件夹的4种办法及其优缺点-...
  • 删除文件夹的时候,可能会遇到文件夹正在使用,操作无法完成,因为其中的文件或文件夹已在另一个程序中打开,请关闭该文件夹或或文件,然后重试。这类无法关闭删除文件夹的情况,如下图所示。 解决这个的...
  • 删除文件是出现上图时 可以用下面的方法删除文件策略一:系统大法第一招 进程帮你搞定许多时候乱码文件名里的文件是explorer.exe进程联系在一起的。如果要删除的话可以这样:首先命令行窗口,通过cd命令进入乱码...
  • 删除文件用的是del命令,删除文件夹必须使用rd命令  rd的另外一个写法是rmdir,源自ReMakeDirectory。使用的方法也很简单:rd 文件夹名 即可,例如:rd test。它支持带路径的文件夹名,例如:rd d:\test。  有...
  • 2、删除文件建一个批处理试试,桌面右键-新建-文本文档-(打开记事本,把下面命令复制后粘贴进去)写入下列命令: DEL /F /A /Q\\?\%1 RD /S /Q \\?\%1 文件-另存为"删除.bat" (名字可以自己选,但是
  • http://www.htmer.com/article/830.htm今天一同事电脑桌面上有一个0KB隐藏文件,死活删除不了,删除时总是提示:无法删除文件,无法读取源文件磁盘。很是奇怪,是中毒吧,我看又不像,杀毒软件也查不出什么毒...
  • 将不能删除文件文件夹拖入此DEL.bat文件就可以删除了! 这个是针对连网上的方法都无法删除的最后一招!   一、常规解决办法: 1.注消重启电脑,然后再试着删除。 2.进入“安全模式删除”。 3.在...
  • Android与IOS一个比较大的不同就是文件夹部分,IOS在卸载应用的时候会同时删除应用所创建的所有文件文件夹,Android不会。 以下是执行这个操作的方法。 首先写一个广播接收器即BroadcastReceiver public class ...
  • 这是由于文件或文件夹在上传过程中,出现连接中断造成。 这时直接使用命令rm -rf 是删除不了。只能通过删除 inode方法处理。 1.用ls -i 命令找到文件或目录 inode 2.删除文件(用 inode 替换下面 665484和...
  • git删除已经push远程文件或文件夹

    千次阅读 2020-03-28 13:12:01
    git删除已经push远程文件或文件夹 在使用git提交项目时,有时候会误提交一下文件,比如:.iml,.project,*.settings,.idea/*等文件,有时候这些不需要提交文件可以加入到.gitignore,在提交时候可以忽略这些...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,600
精华内容 640
关键字:

删除文件或文件夹的方法是