我试图创建一个目录,然后将其删除(出于测试目的,我将省略,但如果需要可以提供详细信息)。
像这样:
>>> import os
>>> os.makedirs('C:\\ProgramData\\dir\\test')
>>> os.remove('C:\\ProgramData\\dir\\test')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
PermissionError: [WinError 5] Access is denied: 'C:\\ProgramData\\dir\\test'
尽管我以管理员身份运行解释器,但我始终会拒绝访问。另外,手动删除目录也没有问题。
使用os.rmdir
删除目录。在Windows上,这是通过调用WinAPI函数来实现的RemoveDirectory
。os.remove
通过调用来实现DeleteFile
,该调用仅用于删除文件。如果filename参数是一个目录,则调用将失败,并将最后一个错误代码设置ERROR_ACCESS_DENIED
为,Python 3为此将引发一个错误代码PermissionError
。
在这种情况下,访问被拒绝错误基于NTSTATUS
代码 STATUS_FILE_IS_A_DIRECTORY
,即。内核的状态代码通常比相应的WinAPI错误更具信息性,但并非总是如此,并且总不能总是一个简单地映射到另一个,这取决于内核,系统进程,服务,环境子系统之间的分工,以及应用程序。在这种情况下,我认为内核状态代码无疑比通用访问拒绝错误具有更多信息。RtlNtStatusToDosError
(0xC00000BA) == 5
在较低级别上,尝试通过删除目录时出错的原因DeleteFile
是,它NtOpenFile
使用FILE_NON_DIRECTORY_FILE
设置为的标志调用了系统服务OpenOptions
,而RemoveDirectory
指定了FILE_DIRECTORY_FILE
。随后,两个函数都调用NtSetInformationFile
来设置FileDispositionInformation
来删除文件或目录。
只是为了相反,让我们仅使用NTFS文件系统上的文件操作来实现整个序列。
>>> import os, pathlib
>>> base = pathlib.Path(os.environ['ProgramData'])
创建“ dir”目录:
>>> dirp = base / 'dir::$INDEX_ALLOCATION'
>>> open(str(dirp), 'w').close()
>>> os.path.isdir(str(dirp))
True
通过将流类型手动指定为$INDEX_ALLOCATION
,打开此“文件”实际上会创建一个NTFS目录。顺便说一句,您还可以将多个命名$DATA
流添加到目录中。请参阅文件流主题。
接下来创建“ test”子目录并调用os.remove
将其删除:
>>> test = base / 'dir' / 'test::$INDEX_ALLOCATION'
>>> open(str(test), 'w').close()
>>> os.path.isdir(str(test))
True
>>> os.remove(str(test))
>>> os.path.exists(str(test))
False
您可能会对此感到惊讶。请记住,在这种情况下,文件名明确指定了$INDEX_ALLOCATION
流。这推翻了FILE_NON_DIRECTORY_FILE
国旗。您得到了您想要的。但是不要依赖于此,因为这些流是NTFS的实现细节,它不是Windows上使用的唯一文件系统。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句