Java:确保Files.list()仅返回“完整”文件

问题描述 投票:0回答:1

在我的应用程序中,我查看新文件的目录。

我保留了使用Files.list(dir)获取的当前文件数组,将此列表一个接一个地处理,然后再次使用Files.list()重新加载目录。

虽然我自己从未遇到过这个问题,但是一位同事告诉我,前任软件还检查了文件是否超过3秒(使用(Files.getLastModifiedTime(path) - System.currentTimeMillis()) > 3000计算),因为存在未完成转移的问题(或更好:尚未完全转移)文件进入处理。

我可以假设Files.list()返回的文件被完全复制到我正在观看的目录中吗?

有没有更清晰的方法来检查文件是否完整? 3秒检查更像是黑客攻击,可以通过慢速连接(网络)复制大小为GB的文件,即使经过3秒也可能无法完全转移。

java filesystems nio
1个回答
0
投票

如果文件在目录中,则认为文件是完整的是不安全的。可能仍然存在与另一个进程相关联的锁,该进程可能正在写入或以其他原因持有锁。

我使用以下方法来检查文件是否准备好(这使用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;
  }
}

这将尝试打开文件以进行追加(打开正常写入将删除其所有内容)并创建锁定。如果确定了锁定,那么我们很乐意去,否则我们不会。

© www.soinside.com 2019 - 2024. All rights reserved.