【问题标题】:Opening system files in Python for hashing Windows 7在 Python 中打开系统文件以散列 Windows 7
【发布时间】:2015-01-11 01:30:12
【问题描述】:

我试图让我的程序递归地遍历 C:\Windows 目录,并获取许多细节,包括文件的 md5 校验和。它工作得很好,除了它无法获得获取文件校验和的权限。这个函数是从我的主函数中调用的,变量filename 是试图被散列的文件的完整路径。错误发生在带有f = open(filename,'rb')的行上,错误为:

---> 84     f = open(filename,'rb')
 85     for chunk in iter(lambda: f.read(128*md5.block_size),b''):
 86         md5.update(chunk)

IOError: [Errno 13] Permission denied: 'C:\\Windows\\Microsoft.NET' 

函数如下:

def checksum_md5(filename):
    md5 = hashlib.md5()
    f = open(filename,'rb')
    for chunk in iter(lambda: f.read(128*md5.block_size),b''):
        md5.update(chunk)
        return md5.hexdigest()

程序不会更改文件,它只需要读取它们并获取校验和。我怎样才能让它工作?它一直工作到 C:\Windows\Microsoft.NET 目录,并按预期工作。

非常感谢!

-高尔夫球手

【问题讨论】:

  • 确保您作为用户拥有对该文件夹的完全访问权限。 (读写权限)告诉我进展如何。
  • 我尝试使用 takeown 和 icacls 在所有 C:\Windows* 目录中授予自己完全权限,但它仍然给我同样的无法访问权限。我尝试了两种不同的方法,一次授予我的特定用户权限,另一次授予管理员组权限。
  • C:\Windows\Microsoft.NET 是文件,还是目录?
  • @duskwuff 根据经验,很可能是一个目录。
  • 目录。我才意识到我的问题。我有一个函数可以确保输入是文件而不是目录,方法是检查它是否有“。”在名字里。我现在怎样才能让它以不同的方式来解决这个问题? def isfile(name): if '.' in name: return True else: return False 是代码。谢谢。

标签: python windows permissions checksum


【解决方案1】:

正如您在 cmets 中所指出的,您尝试打开的对象是目录,而不是文件。 Windows 不允许您打开和读取这样的目录。*

要确定对象是否为目录,请使用os.path.isdir() 函数。如果您传递给它的路径是目录,它将返回Trueos.path 也有一个 isfile() 函数,它做同样的事情,除了检查路径是否为普通文件。


*:可以在某些操作系统上打开和读取目​​录(有时带有open() 的特殊标志,但无论如何这不是你想要做的。

【讨论】:

  • 谢谢一百万。我尝试只执行 if not os.path.isdir(name) == True,但它仍然让 C:\Windows\Microsoft.NET 溜进去。我尝试使用 isfile() 代替,并且效果很好。非常感谢!
  • @1998golfer 考虑将此作为正确答案。你们都得到代表。 xD
  • 好的,做到了。 python 现在正在创建一个 sqlite 数据库,其中包含 C:\Windows 中所有文件的文件名、完整路径和 md5sum。这可能需要一段时间。
  • @duskwuff,它运行了一段时间,但随后停止,出现与之前类似的错误。在目录C:\Windows\CSC\v2.0.6 中,它尝试获取文件“pq”的哈希值,该文件只是一个没有文件扩展名的文件。我可以做些什么来修改我的代码来解决这个问题?非常感谢。
  • CSC 文件夹是特殊的 — it's used for offline file caching。最好跳过它。
猜你喜欢
  • 1970-01-01
  • 2017-05-15
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 2011-07-28
  • 1970-01-01
相关资源
最近更新 更多