Java - Проверить имя файла с текущей датой?
Я все еще очень плохо знаком с 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();
}
}
}
5 ответов
Там может быть два решения
1. Чтобы получить дату последнего изменения файла, мы можем использовать метод lastModified() класса File. Этот метод возвращает длинное значение. После получения этого значения вы можете создать экземпляр класса java.util.Date и передать это значение в качестве параметра. Эта дата будет содержать дату последнего изменения файла.
Вы можете получить все файлы и сравнить дату последнего изменения каждого файла с датой, которую вы запрашиваете.
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!");
}
}
здесь, а не удалять, вы должны переместить эти файлы в нужную папку.
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...
Для nio в Java 7, проверьте, как заменить File.listFiles(фильтр FileFilter) на nio в Java 7
Разобрать имя файла, проверить, если разница между временем и датой> 7 дней
Date date = dateFormat.parse(file.getName());
if (System.currentTimeMillis() - date.getTime() > 7 * 24 * 3600 * 1000) {
// older than 7 days
}
Вы можете сделать это, сравнив имя файла с текущей датой:
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
}
Несколько мыслей...
Остерегайтесь пропустить время из вашего отслеживания. Я знаю, что вы думаете с точки зрения целых дней. Но имейте в виду, что начало и конец дня зависит от часового пояса. Если вы не укажете часовой пояс, будет использоваться JVM по умолчанию. Это означает, что если вы развернули свое приложение на других компьютерах / серверах или иным образом изменили часовой пояс компьютера /JVM, у вас будет другое поведение.
Если вы добавите дефисы в свой формат, вы будете следовать общему формату ISO 8601: YYYY-MM-DD
, Этот формат легче читать. Этот формат также удобно используется Joda-Time (поясняется ниже).
Насколько я знаю, большинство файловых систем раздражаются, когда вы храните более двух или трех тысяч файлов в папке / каталоге. Либо проверьте поведение файловой системы вашей родной ОС, либо сгруппируйте файлы во вложенные папки, например, по месяцам или годам.
Joda времени
Этот вид работы с датой и временем легче с библиотекой Joda-Time. java.util.Date
& Calendar
классы, связанные с Java, общеизвестно проблематичны и их следует избегать.
В 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 );