为什么不能删除在ProgramData中创建的目录?

西缅

我试图创建一个目录,然后将其删除(出于测试目的,我将省略,但如果需要可以提供详细信息)。

像这样:

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

尽管我以管理员身份运行解释器,但我始终会拒绝访问。另外,手动删除目录也没有问题。

孙ry

使用os.rmdir删除目录。在Windows上,这是通过调用WinAPI函数来实现的RemoveDirectoryos.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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我不能在/ sys中创建目录

来自分类Dev

为什么我不能删除“。” 目录?

来自分类Dev

为什么我不能删除该目录?

来自分类Dev

为什么我不能删除目录?

来自分类Dev

为什么我不能删除该目录?

来自分类Dev

为什么不能删除“不存在”但出现在我的下载目录中的文件?

来自分类Dev

为什么我的命令:“ rm -rf *”不能删除目录中的所有文件?

来自分类Dev

为什么我不能在具有组写访问权限的目录中创建文件?

来自分类Dev

为什么我不能在工作目录中创建一个新文件?

来自分类Dev

为什么不能在一个事务中创建和删除表两次?

来自分类Dev

如何使用NSIS删除Windows%appdata%(或%programdata%)中的目录

来自分类Dev

为什么不能删除用new创建的Ogre OverlaySystem?

来自分类Dev

为什么不能从Git的工作目录中丢弃文件?

来自分类Dev

为什么我不能加载资产目录中的图像?

来自分类Dev

为什么我不能加载资产目录中的图像?

来自分类Dev

为什么不能在单独的过程中更改目录?

来自分类Dev

为什么不能删除vim?

来自分类Dev

为什么不能从元素中删除样式?

来自分类Dev

为什么不能从表中删除此外键?

来自分类Dev

为什么我不能从列表中删除所需的元素

来自分类Dev

为什么我不能在Word 2003中删除水印?

来自分类Dev

为什么我不能从该表中删除记录?

来自分类Dev

为什么我不能删除标签中的字符?

来自分类Dev

为什么我不能在代码中删除“ checkSelfPermission”?

来自分类Dev

在python2.7.11中,为什么不能删除fileopen代码?

来自分类Dev

为什么我不能删除表中的行

来自分类Dev

为什么我不能删除git中的文件?

来自分类Dev

为什么rm *(1)*删除目录中的所有文件?

来自分类Dev

为什么不能在mysql中创建新用户?

Related 相关文章

  1. 1

    为什么我不能在/ sys中创建目录

  2. 2

    为什么我不能删除“。” 目录?

  3. 3

    为什么我不能删除该目录?

  4. 4

    为什么我不能删除目录?

  5. 5

    为什么我不能删除该目录?

  6. 6

    为什么不能删除“不存在”但出现在我的下载目录中的文件?

  7. 7

    为什么我的命令:“ rm -rf *”不能删除目录中的所有文件?

  8. 8

    为什么我不能在具有组写访问权限的目录中创建文件?

  9. 9

    为什么我不能在工作目录中创建一个新文件?

  10. 10

    为什么不能在一个事务中创建和删除表两次?

  11. 11

    如何使用NSIS删除Windows%appdata%(或%programdata%)中的目录

  12. 12

    为什么不能删除用new创建的Ogre OverlaySystem?

  13. 13

    为什么不能从Git的工作目录中丢弃文件?

  14. 14

    为什么我不能加载资产目录中的图像?

  15. 15

    为什么我不能加载资产目录中的图像?

  16. 16

    为什么不能在单独的过程中更改目录?

  17. 17

    为什么不能删除vim?

  18. 18

    为什么不能从元素中删除样式?

  19. 19

    为什么不能从表中删除此外键?

  20. 20

    为什么我不能从列表中删除所需的元素

  21. 21

    为什么我不能在Word 2003中删除水印?

  22. 22

    为什么我不能从该表中删除记录?

  23. 23

    为什么我不能删除标签中的字符?

  24. 24

    为什么我不能在代码中删除“ checkSelfPermission”?

  25. 25

    在python2.7.11中,为什么不能删除fileopen代码?

  26. 26

    为什么我不能删除表中的行

  27. 27

    为什么我不能删除git中的文件?

  28. 28

    为什么rm *(1)*删除目录中的所有文件?

  29. 29

    为什么不能在mysql中创建新用户?

热门标签

归档