我想要一些Java代码来删除超过N天的文件。
这是我的尝试,但它不能正常工作。
public void deleteFilesOlderThanNdays(final int daysBack, final String dirWay) {
System.out.println(dirWay);
System.out.println(daysBack);
final File directory = new File(dirWay);
if(directory.exists()){
System.out.println(" Directory Exists");
final File[] listFiles = directory.listFiles();
final long purgeTime =
System.currentTimeMillis() - (daysBack * 24 * 60 * 60 * 1000);
System.out.println("System.currentTimeMillis " +
System.currentTimeMillis());
System.out.println("purgeTime " + purgeTime);
for(File listFile : listFiles) {
System.out.println("Length : "+ listFiles.length);
System.out.println("listFile.getName() : " +listFile.getName());
System.out.println("listFile.lastModified() :"+
listFile.lastModified());
if(listFile.lastModified() < purgeTime) {
System.out.println("Inside File Delete");
}
}
}
else
{
}
}
是否有一些简单的代码可以删除目录中N天以前的文件?
答案 0 :(得分:10)
尝试使用Calendar - Class:
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, daysBack * -1);
long purgeTime = cal.getTimeInMillis();
或尝试this solution:
您的天数是否超过24
?如果是这样,你就会出现溢出问题。
如果天数为25
,则值为:
25 * 24 * 60 * 60 * 1000
数学值为2160000000
。但是,这大于Integer.MAX_VALUE
,因此值溢出
-12516353
。因此,清除时间将在未来,永远不会得到满足。大于25
的值只会使问题变得更糟;甚至可能溢出是如此糟糕,以至于乘法再次产生正值,导致可能清除所有文件。
修复很简单:
daysBack
声明为long
将daysBack
投射到long
long purgeTime = System.currentTimeMillis() - ((long)daysBack * 24 * 60 * 60 * 1000);
在计算中使用显式长文字:
long purgeTime = System.currentTimeMillis() - (daysBack * 24L * 60L * 60L * 1000L);
对于所有三个解决方案,第一个和/或第二个操作数为long的事实将整个结果转换为long,允许值2160000000
而不会溢出。
答案 1 :(得分:5)
我使用这个简单的代码段来删除超过N天的文件
在此代码段中,删除基于文件最后修改日期时间
daysBack =删除超过N天的文件
dirWay =包含文件的目录
public static void deleteFilesOlderThanNdays(int daysBack, String dirWay) {
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);
}
}
}
}
}
由于
答案 2 :(得分:1)
对于您不小心用此擦除硬盘计算机,我不负责任。除非你了解它的作用以及它为什么这样做,否则不要运行它。如果您不小心对root或某个敏感目录运行此文件,旧文件将被永久删除。
此Java程序将收集C:\Users\penguins
中包含文本名称MyLogFile_
的所有文件的列表。它查看每个文件的lastModified()
日期,并查看它的年龄(以毫秒为单位),如果差异大于指定的天数(8天,以毫秒为单位),则删除该文件。
import java.io.File;
import java.util.*;
class Runner{
public static void main(String[] args){
long numDays = 8; //this needs to be a long.
//WARNING! OLD FILES IN THIS DIRECTORY WILL BE DELETED.
String dir = "C:\\Users\\penguins";
//IF YOU ACCIDENTALLY POINT THIS TO C:\\Windows or other sensitive
//directory (and run it) you will be living in the house of pain.
File directory = new File(dir);
File[] fList = directory.listFiles();
if (fList != null){
for (File file : fList){
if (file.isFile() &&
file.getName().contains("MyLogFile_")){
long diff = new Date().getTime() - file.lastModified();
long cutoff = (numDays * (24 * 60 * 60 * 1000));
if (diff > cutoff) {
file.delete();
}
}
}
}
}
}
要使此代码适合您,您需要:
MyLogFile_
字词设置为您要删除的文件的签名。将其设置为空白以查看所有文件。当此代码失败时:
如果系统日期更改为将来或过去,(或某些奇怪的闰秒,时区更改或系统日期编辑)发生,则可能会发生删除横行。如果文件上的日期被人为操纵,那么这可能会继续删除横行。如果权限对文件的限制太多,则不会删除该文件。
答案 3 :(得分:0)
您可以使用file.lastModified()方法
有些事情如下。
文件档案=新档案(“YOUR_FOLDER_PATH”);
long diff = new Date().getTime() - file.lastModified();
if (diff > Z * 24 * 60 * 60 * 1000) {
file.delete();
}
答案 4 :(得分:0)
如果您的意思是“大约30天前”,其他答案都是正确的。但如果你的意思更精确,那么你应该注意时区。如果你的意思是整天,请注意时间。
如果您想使用UTC / GMT,请使用此时区对象:DateTimeZone.UTC
以下是使用Joda-Time 3.2库的示例代码。
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Oslo" );
DateTime now = new DateTime( timeZone );
DateTime cutoff = now.minusDays( 30 ).withTimeAtStartOfDay();
DateTime fileCreationDateTime = new DateTime( 2014, 1, 2, 3, 4, 5, timeZone );
boolean fileShouldBeDeleted = fileCreationDateTime.isBefore( cutoff );
DateTime file2CreationDateTime = now.minusMinutes( 1 );
boolean file2ShouldBeDeleted = file2CreationDateTime.isBefore( cutoff );
转储到控制台...
System.out.println( "now: " + now );
System.out.println( "cutoff: " + cutoff );
System.out.println( "fileCreationDateTime: " + fileCreationDateTime );
System.out.println( "fileShouldBeDeleted: " + fileShouldBeDeleted );
System.out.println( "file2CreationDateTime: " + file2CreationDateTime );
System.out.println( "file2ShouldBeDeleted: " + file2ShouldBeDeleted );
跑步时......
now: 2014-02-07T07:20:32.898+01:00
cutoff: 2014-01-08T00:00:00.000+01:00
fileCreationDateTime: 2014-01-02T03:04:05.000+01:00
fileShouldBeDeleted: true
file2CreationDateTime: 2014-02-07T07:19:32.898+01:00
file2ShouldBeDeleted: false
答案 5 :(得分:0)
使用Java 8的代码段
public static void deleteFilesOlderThanNdays(int daysAgo, String destDir) throws IOException {
Instant instantDaysAgo = Instant.from(ZonedDateTime.now().minusDays(daysAgo));
BiPredicate<Path, BasicFileAttributes> fileIsOlderThanNDays =
(path, attr) -> attr.lastModifiedTime().compareTo( FileTime.from(instantDaysAgo)) < 0 ;
List<Path> filesToDelete = (List) Files.find(Paths.get(destDir), 1 , fileIsOlderThanNDays )
.collect(Collectors.toList());
for (Path path : filesToDelete) {
Files.delete(path);
}
}
答案 6 :(得分:0)
我正在研究类似的东西,我包装了一些 java.nio.file.Files 方法,以便拥有一个干净的基于 Java 8 流的方法。
我的需求是 7 天,但您可以根据需要进行调整:
public void cleanFilesOlderThan7Days() {
try {
Files.walk(Paths.get("temp/raw_reports"))
.filter(Files::isRegularFile)
.filter(FilesUtils::isOlderThan7Days)
.forEach(FilesUtils::delete);
} catch (IOException e) {
log.error("Could not clean old files", e);
}
}
我将包装的方法放在一个 utils 类中:
公共类 FilesUtils {
@SneakyThrows
public static boolean isOlderThan7Days(java.nio.file.Path path) {
FileTime lastModifiedTime = Files.getLastModifiedTime(path);
Duration interval = Duration.between(lastModifiedTime.toInstant(), Instant.now());
return interval.toDays() > 7;
}
@SneakyThrows
public static void delete(java.nio.file.Path path) {
Files.delete(path);
}
}
请注意,我正在使用 Lombok 插件中的 @SneakyThrows。如果您不使用它,您可以实现它或使用 try/catch 来威胁异常。