递归复制带有进度的文件

时间:2011-05-23 08:15:56

标签: python file-io copy progress-bar pyqt4

我之前看过有关Python和复制文件的问题,但我有不同的处理方案。

我差不多完成了我一直在研究的Linux发行版安装程序,现在它需要做的就是将文件复制到目标分区。由于大多数发行版安装程序都有进度条,我希望也添加一个。

现在,我正在使用PyQt4,我的代码如下所示:

self.status('Counting files...')
self.count = int(check_output(['-c', 'find /opt/linux/work/root-image/ -type f | wc -l'], stderr = PIPE, shell = True))

self.status('Copying files...')

i = 0

for root, dirs, files in os.walk('/opt/linux/work/root-image/'):
  for file in files:
    i += 1
    f = os.path.join(root, file)

    try:
      os.system('mkdir -p /tmp/foo' + os.path.split(f)[0])
    except:
      pass

    os.system('cp ' + f + ' /tmp/foo' + f)

    if i % 100 == 0:
      self.emit(SIGNAL('progress(int)'), int(100.0 * float(i) / float(self.count)))

self.status('Done...')

由于进度条,效率很低。整个图像为2.1GB,并且脚本需要真正长时间来复制文件。 很多比简单的cp -r更长。

有没有有效的方法呢?对于单文件复制进度条,您所做的只是一次读取少量块,但我不知道如何为包含91,489文件的目录执行此操作。

任何帮助都会有所帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

您可以尝试使用shutil.copy复制文件,而不是使用os.system(创建单独的进程)调用操作系统。您还可以使用os.mkdir创建新目录。但是,你确定因为进度条而不是其他东西它很慢吗?