Windows上的os.path.getsize在复制时报告完整文件大小

时间:2016-01-04 07:48:46

标签: windows file python-2.7 os.path

我正在将一个大文件,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)

3 个答案:

答案 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)

您可以按照os.stat()使用here 有关使用情况的详细示例,请参阅this

答案 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)