让Python tarfile跳过没有读权限的文件

1 投票
3 回答
3061 浏览
提问于 2025-04-15 22:57

我正在尝试写一个函数,用来在Windows XP上备份一个包含不同权限文件的目录。我使用tarfile模块来打包这个目录。目前,当程序遇到一个没有读取权限的文件时,它就会停止,并给出错误提示:IOError: [Errno 13] 权限被拒绝:'文件路径'。我希望它能跳过那些无法读取的文件,而不是直接结束打包操作。以下是我现在使用的代码:

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

3 个回答

-1

补充一下大家说的内容,Python里有一个内置的函数,你可以用它来检查文件是否具备某个属性。你只需要把文件路径和你想检查的属性传给这个函数,比如:hasattr('/path/to/file.txt', "read") 用来检查文件是否可以读取,或者 hasattr('/path/to/file.txt', "write") 来检查文件是否可以写入,依此类推。希望这对其他人也有帮助。

1

你需要在尝试添加具有读取权限的文件时,也使用相同的 try/except 结构。现在,如果任何文件或子目录无法读取,你的程序就会崩溃。

另一种不那么依赖于 try 结构的方法是,在尝试将文件或文件夹添加到你的压缩包之前,先检查它们的权限。关于如何最好地做到这一点,有一个完整的问题讨论(还有一些在使用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
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的参数,不然可能会遇到一些问题。

撰写回答