删除java中超过一天的文件夹

时间:2018-06-18 16:11:34

标签: java

我正在尝试使用以下代码从java中的路径删除所有旧文件夹:

public static void removeDirectory(File dir) {

    long purgeTime = System.currentTimeMillis() - (1 * 24 * 60 * 60 * 1000);

    if (dir.isDirectory()) {
        File[] files = dir.listFiles();

        for (File aFile : files) {
            if (aFile.lastModified() < purgeTime) {
                removeDirectory(aFile);
            }
        }
        dir.delete();
    } else {
        dir.delete();
    }
}

public static void createBackupFS(java.awt.event.ActionEvent evt) {

    File directory = new File(pathsavefsbackup.getText());
    removeDirectory(directory);
}

唯一发生的事情是使用当前时间修改旧文件。 提到根文件夹中有一个文件夹,里面有文件。

路径结构:

根文件夹 - 最后修改(2天前) - &gt; test folder last modified(2天前) - &gt; file1.jpg(最后修改3天前),file2.txt(最后修改4天前)。

有人可以帮助我吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

for循环遍历给定文件夹中的每个文件

for (File aFile : files)

所以你要做的就是检查当前文件是否超过24小时,如果它是删除它,否则不是。 您不需要在此处过度复杂化代码是代码的修改版本。

以下代码删除超过1天的给定目录中的任何文件夹/文件

   public static void removeDirectory(File dir) {
        boolean delSource = false;
        long purgeTime = System.currentTimeMillis() - (10 * 1000);
        if (dir.lastModified()< purgeTime) delSource = true;
        if (dir.isDirectory()) {
            File[] files = dir.listFiles();
            for (File aFile : files) {
                if (aFile.lastModified() < purgeTime) {
                    aFile.delete();
                }
            }
        }
        if(delSource) dir.delete();
    }

    public static void createBackupFS() {

        File directory = new File("F:\\document\\eclipse\\JavaAZ\\src\\Delete");
        removeDirectory(directory);
    }

PS:如果文件中有文件等等你必须使用递归

所有文件和文件夹的递归解决方案

public static void removeDirectory(File dir) {
        long purgeTime = System.currentTimeMillis() - (1 * 24 * 60 * 60 * 1000);

        if(dir.isDirectory() == false && dir.lastModified() < purgeTime) dir.delete();
        else if (dir.isDirectory() == true && dir.lastModified() < purgeTime) recursiveDelete(dir);
        else if(dir.isDirectory()){
             File[] files = dir.listFiles();
             for (File aFile : files)
                 removeDirectory(aFile);
        }
    }

    public static void createBackupFS() {

        File directory = new File("F:\\downloads\\Compressed\\backup");
        removeDirectory(directory);
    }
     public static void recursiveDelete(File file) {
            if (!file.exists())
                return;

            if (file.isDirectory()) {
                for (File f : file.listFiles()) {
                    recursiveDelete(f);
                }
            }
            file.delete();
        }

答案 1 :(得分:1)

Java NIO2(路径,文件,FileVisitor)

我正在使用2个实现FileVisitor接口的类。 第一个检测到在X时间段之前已修改的所有文件夹/子文件夹。 第二个删除第一个类

存储的所有文件夹

Files.walkFileTree(Path, FileVisitor<Class>)用于遍历目录。 一个内的所有类(您可以将FileVisitorFoldersFileVisitorDeleteFolders提取到类文件

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.Instant;
import java.time.Period;
import java.util.ArrayList;

public class Main {


    private static class FileVisitorFolders implements FileVisitor<Path> {

        private Instant beforePeriodOfTime;
        private ArrayList<Path> directories = new ArrayList<>(10);

        public FileVisitorFolders(Period time) {
            beforePeriodOfTime = Instant.now().minus(time);
        }

        public ArrayList<Path> getDirectories() {
            return directories;
        }

        @Override
        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
            var lastModifiedTime = Files.getLastModifiedTime(dir, LinkOption.NOFOLLOW_LINKS);
            if (lastModifiedTime.toInstant().isBefore(beforePeriodOfTime)) {
                directories.add(dir);
            }
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
            return FileVisitResult.CONTINUE;
        }
    }

    private static class FileVisitorDeleteFolders implements FileVisitor<Path> {


        @Override
        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
            Files.delete(file);
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
            Files.delete(dir);
            return FileVisitResult.CONTINUE;
        }
    }

    public static void main(String[] args) {
        var fileVisitorFolders = new FileVisitorFolders(Period.ofDays(1));
        var fileVisitorDeleteFolder = new FileVisitorDeleteFolders();
        try {
            Files.walkFileTree(Paths.get("testFolder"), fileVisitorFolders);
            for (Path dir : fileVisitorFolders.getDirectories()) {
                System.out.printf("Deleting: %s\n", dir.toAbsolutePath().toString());
                Files.walkFileTree(dir, fileVisitorDeleteFolder);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如何运作?

这里我们有下一个目录:(注意:今天是2018-06-18

tree -D testFolder/
testFolder/
├── [Jun 17  5:00]  a
├── [Jun 18 18:06]  b
├── [Jun 15  5:00]  c
│   ├── [Jun 18 18:06]  e
│   └── [Jun 18 18:06]  hi
└── [Jun 18 17:30]  e

5 directories, 1 file

文件夹a已于1天前修改,文件夹c已在3天前修改过。 文件夹a为空,文件夹c包含子文件夹e和文件hi

主要方法是:

 public static void main(String[] args) {
        var fileVisitorFolders = new FileVisitorFolders(Period.ofDays(1));
        var fileVisitorDeleteFolder = new FileVisitorDeleteFolders();
        try {
            Files.walkFileTree(Paths.get("testFolder"), fileVisitorFolders);
            for (Path dir : fileVisitorFolders.getDirectories()) {
                System.out.printf("Deleting: %s\n", dir.toAbsolutePath().toString());
                Files.walkFileTree(dir, fileVisitorDeleteFolder);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  1. 递归检查testFolder的所有子文件夹并保存每个文件夹的路径,而不是在此段时间之前修改过的文件夹:Period.ofDays(1)
  2. 删除(递归)以前保存的所有文件夹(路径)
  3. 输出:

    Deleting: /root/IdeaProjects/DeleteFolder/testFolder/a
    Deleting: /root/IdeaProjects/DeleteFolder/testFolder/c
    
    Process finished with exit code 0
    

    现在我们有:

    tree -D testFolder/
    testFolder/
    ├── [Jun 18 18:06]  b
    └── [Jun 18 17:30]  e
    
    2 directories, 0 files
    

    注意:在使用它之前,请测试它对该行的评论://Files.walkFileTree(dir, fileVisitorDeleteFolder); 要更改上次修改的文件/文件夹的日期(在Linux上),您可以使用命令touch,如:

    touch -m -t 201806150700 folderName/fileName
    

    -m - &gt;上次修改时间

    -t - &gt;时间

    如果您想要更少的代码,请使用extends SimpleFileVisitor代替implements FileVisitor并仅实现必要的方法(省略所有空方法)

    如果您在1.10之前使用Java,请将var替换为实例类型。

    重要 小心这段代码。如果父文件夹(在本例中为:testFolder)在最后一段时间内没有被修改,它也将被删除。

    要避免这种情况,您可以修改主要方法:

      public static void main(String[] args) {
            var parent = Paths.get("testFolder");
            var fileVisitorFolders = new FileVisitorFolders(Period.ofDays(1));
            var fileVisitorDeleteFolder = new FileVisitorDeleteFolders();
            try {
                Files.walkFileTree(parent, fileVisitorFolders);
                var foldersToDelete = fileVisitorFolder.getDirectories();
                foldersToDelete.remove(parent);
                for (Path dir : foldersToDelete) {
                    System.out.printf("Deleting: %s\n", dir.toAbsolutePath().toString());
                    Files.walkFileTree(dir, fileVisitorDeleteFolder);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }