【问题标题】:os.stat doesn't update when large file is being copied复制大文件时 os.stat 不更新
【发布时间】:2013-01-05 04:32:57
【问题描述】:

我正在使用 stat 检查文件是否仍在传输,但它不工作。如果我通过网络复制一个大文件(数百 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

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

【问题讨论】:

  • 这不是需要其他进程配合执行flush吗?
  • os.path.getsize(filepath) 也可以用来获取文件大小。
  • getsize() 也不起作用 - 它报告文件的最终大小。
  • 您对传输过程有任何控制权吗?如果您的传输机制允许,则在传输完成时重命名文件是一个可靠的信号(例如,ftpsftp)。
  • 我想我可能只是从文件末尾向后搜索,直到它不再看到所有零,然后睡觉,然后再次做同样的事情,比较每次搜索的距离。但是,其中包含大量零的文件会导致问题。

标签: python windows file


【解决方案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)

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

因此,对于我的使用 - 在脚本中扫描文件夹并检查新文件 - 我最终使用了检查句柄(针对本地文件)和检查 mtime 和大小(针对外部文件)的组合。

【讨论】:

  • Powershell 是我这些天来解决它的方法。
猜你喜欢
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 2013-12-06
相关资源
最近更新 更多