1

我对 Java 还是很陌生,并且正在制作一个小程序,它必须检查一个文件夹,里面装满了数千个文件,这些文件以它们以某种格式创建的日期命名(YYYYMMDD例如20130228,将它们移动到新目录中。目前我的代码可以扫描文件夹并给我一个文件名列表,如果它发现有多个文件,它会创建它们需要移动到的文件夹,但我将如何实际去做检查文件名并移动它们是否超过 7 天?

这是我到目前为止所拥有的:

public static void main(String[] args) {
    Date date = new Date();
    SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-DD");

    // Gets a list of files in specified folder
    File folder = new File("C:/Users/workspace/Test");
    File[] listOfFiles = folder.listFiles();
    for (File file : listOfFiles) {
        if (file.isFile()) {
            System.out.println(file.getName());
        }
    }

    // Creates a temp folder with the date if files are in the specified folder
    File file = new File("C:/Users/workspace/Test");
    if (file.isDirectory()) {
        String[] files = file.list();
        if (files.length > 0) {
            File dir = new File("Temp " + (dateFormat.format(date)));
        dir.mkdir();
        }
    }
}
4

5 回答 5

1
class OldFileFilter extends FileFilter {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    public boolean accept(File f) {
        Date date = dateFormat.parse(f.getName());
        return System.currentTimeMillis() - date.getTime() > 7 * 24 * 3600 * 1000;
    }

    public String getDescription() {
        return "Filter old files";
    }
}

File[] files = dir.listFiles(new OldFileFilter());
//Then move...

对于 Java 7 中的 nio,请查看How to replace File.listFiles(FileFilter filter) with nio in Java 7

于 2013-02-28T10:20:18.280 回答
0

可能有两种解决方案

1- 要获取文件的最后修改日期,我们可以使用 File 类的 lastModified() 方法。此方法返回一个 long 值。获取此值后,您可以创建 java.util.Date 类的实例并将此值作为参数传递。此日期将保存文件的最后修改日期。

您可以获取所有文件并将每个文件的 lastModified 日期与您请求的日期进行比较。

2-

public static void deleteFilesOlderThanNdays(int daysBack, String dirWay, org.apache.commons.logging.Log log) {

    File directory = new File(dirWay);
    if(directory.exists()){

        File[] listFiles = directory.listFiles();            
        long purgeTime = System.currentTimeMillis() - (daysBack * 24 * 60 * 60 * 1000);
        for(File listFile : listFiles) {
            if(listFile.lastModified() < purgeTime) {
                if(!listFile.delete()) {
                    System.err.println("Unable to delete file: " + listFile);
                }
            }
        }
    } else {
        log.warn("Files were not deleted, directory " + dirWay + " does'nt exist!");
    }
}

在这里而不是删除你应该将这些文件移动到你想要的文件夹。

于 2013-02-28T10:11:39.687 回答
0

解析文件名,检查现在和日期之间的差异是否> 7天

Date date = dateFormat.parse(file.getName());
if (System.currentTimeMillis() - date.getTime() > 7 * 24 * 3600 * 1000) {
    // older than 7 days
}
于 2013-02-28T10:16:20.673 回答
0

您可以通过将文件名与当前日期进行比较来做到这一点:

          SimpleDateFormat formatter;
          formatter = new SimpleDateFormat("yyyyMMdd");
          Date d = null;
          try {
            d = formatter.parse(filename);//filename of the file
        } catch (ParseException e) {
            e.printStackTrace();
        }

     Date newDate = new Date();
    if (newDate.getTime() - d.getTime() > 7 * 24 * 3600 * 1000) {
        //Whatever You want to do
    }
于 2013-02-28T10:19:00.303 回答
0

一些想法……</p>

谨防从跟踪中省略时间。我知道你在考虑一整天。但请记住,一天的开始和结束取决于时区。如果不指定时区,则使用 JVM 的默认值。这意味着,如果您将应用程序部署在其他计算机/服务器上,或者以其他方式更改计算机/JVM 的时区,您将获得不同的行为。

如果您在格式中包含连字符,您将遵循常见的ISO 8601格式:YYYY-MM-DD. 这种格式更容易阅读。Joda-Time 也方便地使用该格式(如下所述)。

据我所知,当您在文件夹/目录中存储超过两三千个文件时,大多数文件系统都会变得暴躁。验证本机操作系统文件系统的行为,或将文件分组在嵌套文件夹中,例如按月或按年。

乔达时间

使用Joda-Time库,这种日期时间工作更容易。与 Java 捆绑在一起的java.util.Date&Calendar类是出了名的麻烦,应该避免使用。

在 Joda-Time 中,如果您确实确定要忽略时间和时区,请使用该LocalDate课程。否则,使用DateTime类加上一个DateTimeZone对象。

LocalDate now = LocalDate.now();
LocalDate weekAgo = now.minusWeeks( 1 );

String input = "20130228";

DateTimeFormatter formatter = DateTimeFormat.forPattern( "yyyyMMdd" );
LocalDate fileLocalDate = formatter.parseLocalDate( input );

boolean isThisFileOld = fileLocalDate.isBefore( weekAgo );
于 2014-02-11T11:58:31.013 回答