当大文件被复制时,os.stat不会更新

我正在使用统计来检查一个文件是否仍在传输,但它不工作。 如果我通过networking复制大文件(说几百GB,可能需要几分钟),然后运行脚本

from os import stat from time import sleep While True: stat("thefile.foo") sleep(2) 

我希望看到时间或大小的变化,但它保持不变。 还有什么我可以用来检查一个文件是否仍在传输? 这是不幸的在Windows服务器上。

不更新的统计数据的屏幕截图

我试过这个脚本,实际上读取文件:

 import sys finished=False oldgb=0 while not finished: f=open(thefile,"rb") samp=f.read(1) gb=0 while samp!= b'': sys.stdout.flush() gb+=1000000000 f.seek(gb) samp=f.read(1) print(gb/1000000000,samp) f.close() print(oldgb, gb) if gb>oldgb: oldgb=gb else: finished=True 

并注意到,当文件被复制时,尚未被复制的字节被初始化为零,因此文件大小没有更新。 我可能会使用校验和来检查文件是否改变了。

好吧,这是一个骇人听闻的解决方案:首先我安装了sysinternals handle.exe 。 我用它来查看文件是否有任何打开的句柄,因此:

 import subprocess from time import sleep filename="file.foo" finished = False while not finished: handlesactive=subprocess.check_output("handle.exe") activehandles=str(handlesactive).count(filename) if activehandles == 0: finished = True print("still busy") sleep(2) 

编辑:这适用于在机器上传输的文件 – 例如从一个本地文件复制到另一个本地文件,但是如果外部机器正在传输文件,则不会创建文件句柄。 然而,在这种情况下文件的mtime 改变(幸运的是)。

所以为了我的使用 – 在一个脚本来扫描一个文件夹,并检查新的文件 – 我结束了使用检查处理(本地文件),检查mtime和大小(外部文件)的组合。