2011-05-23 34 views
1

我已經在這裏看到過有關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

您可以嘗試使用shutil.copy來複制文件,而不是使用os.system(它創建一個單獨的進程)調用操作系統。您也可以使用os.mkdir來創建新的目錄。但是,您確定由於進度條而不是很慢嗎?

+0

信號發射減慢了很多事情。但我會嘗試這些變化,也許這個過程真的放慢了速度。 – Blender 2011-05-23 08:25:18

+0

如果你有91489個文件,並且你在每100個文件後發射一個信號,那麼這僅僅是914個信號發射 - 這應該不成問題。如果您在for循環中註釋掉'self.emit'部分並使用上面的''os.system''一個接一個地複製文件,速度會更快嗎? – 2011-05-23 08:27:47

+0

我現在正在測試它。似乎卡在破損的符號鏈接上(如果根目錄是源代碼,則工作正常,但在主機系統上不起作用)。 – Blender 2011-05-23 08:32:03