Рекурсивное копирование файлов с прогрессом - PullRequest
1 голос
/ 23 мая 2011

Я уже задавал здесь вопросы о 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 голос
/ 23 мая 2011

Вы можете попробовать использовать shutil.copy для копирования файлов вместо вызова в ОС с помощью os.system (который создает отдельный процесс). Вы также можете использовать os.mkdir для создания новых каталогов. Тем не менее, вы уверены, что это медленно из-за индикатора выполнения, а не что-то еще?

...