2010-05-20 3 views
1

Я пытаюсь написать функцию, которая создает резервную копию каталога с файлами с разными разрешениями в архив в Windows XP. Я использую tarfile-модуль для tar-каталога. В настоящее время, как только программа встречает файл, который не имеет прав на чтение, он перестает выдавать ошибку: IOError: [Errno 13] Permission denied: 'путь к файлу'. Я хотел бы, чтобы вместо этого просто пропустить файлы, которые он не может прочитать, а не завершить операцию tar. Это код, я использую в настоящее время:Получить tar-файл python для пропуска файлов без разрешения на чтение

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

Вы должны добавить больше заявлений попробовать:

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, заключается в проверке разрешений, прежде чем пытаться добавить файл/папку в ваш архив. Существует целый вопрос о том, как лучше это сделать (и некоторые ловушки, чтобы избежать при использовании 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

Просто, чтобы добавить к тому, что все остальные уже сказал, есть родная функция питона, к которому вы можете передать параметр файла и свойство, которое вы ищете, чтобы проверить для этого свойства: hasattr('/path/to/file.txt', "read") ИЛИ hasattr('/path/to/file.txt', "write") и так далее надежду эту помогает кому-то еще