2012-03-15 32 views
0

我需要存储用户上传的文件。我被告知我将它存储在磁盘上(而不是像使用数据库blob或缓存系统那样尝试任何东西)。如何在磁盘上存储文件并保证它们在Java中被删除

但是从那里,我需要弄清楚如何确保文件最终被删除(也许在他们上次访问后一小时)。这是在Linux服务器上。那么确保文件被删除的最好方法是什么?

回答

1

最简单的方法是定期检查上传目录并删除每个超过一个小时的文件。

如果你这样做,你不需要担心在重新启动服务器时跟踪文件。

可能是这样的:

File uploads = new File("/tmp/uploads"); 

FileFilter hourOld = new FileFilter() { 
    @Override 
    public boolean accept(File file) { 
    return file.lastModified() < System.currentTimeMillis() - 60 * 60 * 1000; 
    } 
}; 

for (File file : uploads.listFiles(hourOld)) { 
    file.delete(); 
} 

你可以使用ScheduledExecutorService安排此。

1

为了保证删除,我将运行一个单独的进程,该进程在启动时作为服务启动以删除文件。这样,即使程序没有运行,它们也会被删除。

通常,只需确保在服务运行时删除文件即可。您只需确保文件已关闭,并且您有一个后台线程定期检查上次访问的时间。

2

有很多方法可以做到这一点:

  • 您可以find $path -daystart -mtime +1 -exec rm "{}" \;运行cron作业 - 即在删除前一天创建的所有文件。

  • 当文件被上传,你可以列出在Java中的文件夹,并删除其过于陈旧

  • 您可以添加Quartz到您的应用程序的两个选项将所有文件。

由于您在Linux上,文件锁定不会成为问题。即使进程仍在使用它们,您也可以在Linux上删除文件(只要进程使用该文件并在之后删除,Linux将保留该文件)。

1

tmpwatch计划的目的是执行此任务的准确。请注意,如果使用noatime选项安装了文件系统,它将无法正常工作。

1

您可以使用临时文件。您可以定义它们是否应该在VM终止时被删除:

public static File createTempFile(String name, String suffix) { 
    try { 
     File temp = File.createTempFile(name, "." + suffix); 

     temp.deleteOnExit(); 
     return temp; 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

但是没有强大的保证,因为删除只会在定期终止时成功。

相关问题