我正在编写一个实用程序来检查一个非常大的文件是否已完全传输。
根据我在网上找到的信息,我了解到最好的方法是让发件人发送一个小文件以表明文件传输已完成。例如,发送一个 10GB 的视频文件后bigfile.mov
,发送方再发送一个 1KBbigfile.txt
的包含校验和或其他东西来识别文件;接收器然后轮询bigfile.txt
.
但是,就我而言,这种方法对我不开放,因为我无法控制发送给我的文件。因此,我采用了更不可靠的方法,即在指定的时间间隔内轮询文件一定次数,以了解其文件大小和最后修改时间。
public static boolean hasFinished(String sFilename, int polls, int interval) {
boolean isDone = true;
File file = new File(sFilename);
long size = file.length();
long lastModified = file.lastModified();
if (file.isFile()) {
for (int i = 0; i < polls; i++) {
// sleep a bit
try {
TimeUnit.SECONDS.sleep(interval);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Checking...");
if (file.length() != size || file.lastModified() != lastModified) {
isDone = false;
break;
}
}
}
return isDone;
}
我正在 Windows 上编写此实用程序,并通过将一个非常大的文件从临时位置复制到我想要的位置(例如C:\bigfile.mov
)来测试它。问题是,一旦文件复制开始,文件大小和最后修改时间似乎都被锁定,所以即使我在文件仍在复制时测试此方法,我仍然得到true
我的结果(显然不是这样)。
在这种情况下我应该如何更改我的代码?