2010-05-20 55 views
1

我正在嘗試編寫一個函數,該文件在Windows XP上備份一個具有不同權限的文件的目錄。我正在使用tarfile模塊來對目錄進行tar。目前只要程序遇到沒有讀取權限的文件,就會停止提供錯誤:IOError:[Errno 13]權限被拒絕:'文件路徑'。我希望它跳過它無法讀取的文件,而不是結束tar操作。這是我現在使用的代碼:獲取python tarfile跳過沒有讀取權限的文件

def compressTar(): 
"""Build and gzip the tar archive.""" 
folder = 'C:\\Documents and Settings' 
tar = tarfile.open ("C:\\WINDOWS\\Program\\archive.tar.gz", "w:gz") 

try: 
    print "Attempting to build a backup archive" 
    tar.add(folder) 
except: 
    print "Permission denied attempting to create a backup archive" 
    print "Building a limited archive conatining files with read permissions." 

    for root, dirs, files in os.walk(folder): 
    for f in files: 
    tar.add(os.path.join(root, f)) 
    for d in dirs: 
    tar.add(os.path.join(root, d)) 

回答

2

您應該添加更多的try語句:

for root, dirs, files in os.walk(folder): 
    for f in files: 
     try: 
     tar.add(os.path.join(root, f)) 
     except IOError: 
     pass 
    for d in dirs: 
     try: 
     tar.add(os.path.join(root, d), recursive=False) 
     except IOError: 
     pass 

[編輯]作爲Tarfile.add默認是遞歸的,添加目錄時,我已經添加了recursive=False參數,否則你可能會遇到的問題。

1

你需要,當你試圖將這些文件具有讀取權限添加對同一try/except塊。現在,如果任何文件或子目錄不可讀,那麼程序將崩潰。

另一個不依賴於try塊的選項是在嘗試將文件/文件夾添加到tarball之前檢​​查權限。有一個關於如何最好地做到這一點(和一些缺陷在使用Windows時,避免)的整體問題:Python - Test directory permissions

基本僞代碼將是這樣的:

if folder has read permissions: 
    add folder to tarball 
else: 
    for each item in folder: 
     if item has read permission: 
      add item to tarball 
0

我想補充一下其他人說,有哪個可以傳遞文件參數和你正在尋找以檢查屬性的屬性原來的Python功能:hasattr('/path/to/file.txt', "read")hasattr('/path/to/file.txt', "write")等 希望這幫助那裏的其他人