1

我正在尝试编写一个函数,该函数将具有不同权限文件的目录备份到 Windows XP 上的存档。我正在使用 tarfile 模块来 tar 目录。目前,一旦程序遇到没有读取权限的文件,它就会停止给出错误:IOError: [Errno 13] Permission denied: 'path to file'。我希望它只是跳过它无法读取的文件,而不是结束 tar 操作。这是我现在使用的代码:

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))
4

3 回答 3

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

[edit] 由于 Tarfile.add 默认是递归的,所以我recursive=False在添加目录时添加了参数,否则你可能会遇到问题。

于 2010-05-20T18:18:51.650 回答
1

当您尝试添加具有读取权限的文件时,您将需要相同的try/块。except现在,如果任何文件或子目录不可读,那么您的程序将崩溃。

另一个不太依赖try块的选项是在尝试将文件/文件夹添加到 tarball 之前检查权限。关于如何最好地做到这一点有一个完整的问题(以及使用 Windows 时要避免的一些陷阱):Python - 测试目录权限

基本的伪代码类似于:

if folder has read permissions:
    add folder to tarball
else:
    for each item in folder:
        if item has read permission:
            add item to tarball
于 2010-05-20T18:15:55.840 回答
-1

只是为了补充其他人所说的,有一个本机 python 函数,您可以将文件参数和您正在寻找的属性传递给它以检查该属性:hasattr('/path/to/file.txt', "read")或者hasattr('/path/to/file.txt', "write")等等希望这对其他人有帮助

于 2012-10-11T09:09:19.417 回答