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

时间:2013-01-22 01:31:56

标签: python windows file

我正在使用stat来检查文件是否仍在传输,但它无法正常工作。如果我通过网络复制一个大文件(说几百千兆字节,它们可能需要几分钟),我运行脚本

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

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

screen shot of stats not updating

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

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

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

1 个答案:

答案 0 :(得分:1)

好的,这是hackalicious解决方案:首先我安装了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和大小(用于外部文件)的组合。