我正在将一个大文件,2.23GB(2,401,129,714字节)从一个位置复制到网络共享上的另一个位置。我使用以下代码通过检查文件大小来检查文件何时完成复制。我在Windows 7 Python 2.7.11上,os.path.getsize
在文件开始复制时报告完整的文件大小,文件不会增长。还有另一种方法可以判断文件何时在Python中完成复制?
copying = True
size2 = -1
while copying:
size = os.path.getsize('name of file being copied')
if size == size2:
print "File has finished copying"
break
else:
size2 = os.path.getsize('name of file being copied')
time.sleep(2)
答案 0 :(得分:2)
编辑:解决方案-
import os
import time
def main( event, path ):
if os.path.exists(path):
while True:
try:
new_path= path + "_"
os.rename(path,new_path)
os.rename(new_path,path)
time.sleep(0.05)
print("event type: %s path: %s " %(event.event_type, path))
break
except OSError:
time.sleep(0.05)
我利用了以下事实:没有两个进程可以模拟地将文件用于IO操作。在Windows中,正在复制文件时,操作系统进程将其保持打开状态。复制完成后,操作系统进程将关闭文件,并且python中的os模块最终可以成功重命名文件
@ Anmol-不重复。在Windows中,此代码的问题在于os保留了一个二进制文件并在复制时将其覆盖,因此os.stat显示的大小不会递增。我们希望有一段代码可以在图像复制完成时通知我们。这个特定的代码是一种轮询代码,在Linux上运行良好,并且在复制过程完成时会通知我们(在Linux中,大小会随着时间的推移而逐渐增加)
import os
import time
def main( event,path ):
historicalSize = -1
while (historicalSize != os.path.getsize(path)):
historicalSize = os.stat(path).st_size
print("Size now %s" %historicalSize)
time.sleep(1)
else: print( "event type: %s path: %s " %(event.event_type, path))
输出应该像
Size now 124
Size now 12345
Size now 238590
.....
,而不只是
Size now 23459066950
答案 1 :(得分:1)
答案 2 :(得分:0)
os.stat()和os,path.getsize()显示最终分配的大小,唯一的解决方案是尝试执行代码并尝试try catch块,然后进行睡眠重试
这也可以在Linux上使用,这样您就不必费心轮询刚刚重试的大小。当然,下面的代码应该进行一些改进,以确保您不会遇到无限循环
while True:
try:
OsAbstract.copy(src, file_metas.get_tmp_full_destination())
break
except PermissionError:
time.sleep(0.5)