递归复制文件并显示进度

1 投票
1 回答
2149 浏览
提问于 2025-04-16 18:10

我之前在这里看到过关于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 个回答

1

你可以试试用 shutil.copy 来复制文件,而不是用 os.system 去调用操作系统(这样会启动一个新的进程)。你还可以用 os.mkdir 来创建新的文件夹。不过,你确定慢是因为进度条的问题,而不是其他原因吗?

撰写回答