在我的应用程序中,我查看新文件的目录。
我保留了使用Files.list(dir)
获取的当前文件数组,将此列表一个接一个地处理,然后再次使用Files.list()
重新加载目录。
虽然我自己从未遇到过这个问题,但是一位同事告诉我,前任软件还检查了文件是否超过3秒(使用(Files.getLastModifiedTime(path) - System.currentTimeMillis()) > 3000
计算),因为存在未完成转移的问题(或更好:尚未完全转移)文件进入处理。
我可以假设Files.list()
返回的文件被完全复制到我正在观看的目录中吗?
有没有更清晰的方法来检查文件是否完整? 3秒检查更像是黑客攻击,可以通过慢速连接(网络)复制大小为GB的文件,即使经过3秒也可能无法完全转移。
如果文件在目录中,则认为文件是完整的是不安全的。可能仍然存在与另一个进程相关联的锁,该进程可能正在写入或以其他原因持有锁。
我使用以下方法来检查文件是否准备好(这使用java 1.8)
public static boolean isFileReady(Path file) {
try(FileChannel ch = FileChannel.open(file, StandardOpenOption.WRITE, StandardOpenOpption.APPEND); FileLock lock = ch.tryLock()) {
if (lock == null) return false;
return true;
} catch (IOException ex) {
return false;
}
}
这将尝试打开文件以进行追加(打开正常写入将删除其所有内容)并创建锁定。如果确定了锁定,那么我们很乐意去,否则我们不会。