Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我不能删除在ProgramData中创建的目录?_Python_Windows_Permissions_File Permissions - Fatal编程技术网

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

Python 为什么我不能删除在ProgramData中创建的目录?,python,windows,permissions,file-permissions,Python,Windows,Permissions,File Permissions,我正在尝试创建一个目录,然后出于测试目的删除它,我将删除它,但如果需要,可以提供详细信息 像这样: >>> import os >>> os.makedirs('C:\\ProgramData\\dir\\test') >>> os.remove('C:\\ProgramData\\dir\\test') Traceback (most recent call last): File "<stdin>", line 1, in

我正在尝试创建一个目录,然后出于测试目的删除它,我将删除它,但如果需要,可以提供详细信息

像这样:

>>> 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函数实现的。os.remove是通过调用来实现的,该调用仅用于删除文件。如果filename参数是一个目录,那么调用将失败,并将最后一个错误代码设置为,Python 3将为此引发PermissionError

在这种情况下,拒绝访问错误基于状态_FILE_is_A_DIRECTORY,即0xC00000BA==5。通常,内核的状态代码比相应的WinAPI错误更具信息性,但并非总是如此,而且并不总是存在从一个到另一个的简单映射,这取决于内核、系统进程、服务、环境子系统和应用程序之间的关系。在这种情况下,我认为内核状态代码无疑比一般的拒绝访问错误信息更丰富

在较低级别,尝试通过DeleteFile删除目录时出错的原因是,它使用OpenOptions中设置的FILE_NON_directory_FILE标志调用系统服务,而RemoveDirectory指定FILE_directory_FILE。随后,这两个函数都调用以设置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_分配,打开此“文件”实际上会创建一个NTFS目录。顺便说一句,您还可以将多个命名的$数据流添加到一个目录中。参考主题

接下来创建“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_分配流。这将推翻文件\非\目录\文件标志。你得到你想要的。但不要依赖于此,因为这些流是NTFS的一个实现细节,NTFS不是Windows上使用的唯一文件系统。

使用os.rmdir删除目录。在Windows上,这是通过调用WinAPI函数实现的。os.remove是通过调用来实现的,该调用仅用于删除文件。如果filename参数是一个目录,那么调用将失败,并将最后一个错误代码设置为,Python 3将为此引发PermissionError

在这种情况下,拒绝访问错误基于状态_FILE_is_A_DIRECTORY,即0xC00000BA==5。通常,内核的状态代码比相应的WinAPI错误更具信息性,但并非总是如此,而且并不总是存在从一个到另一个的简单映射,这取决于内核、系统进程、服务、环境子系统和应用程序之间的关系。在这种情况下,我认为内核状态代码无疑比一般的拒绝访问错误信息更丰富

在较低级别,尝试通过DeleteFile删除目录时出错的原因是,它使用OpenOptions中设置的FILE_NON_directory_FILE标志调用系统服务,而RemoveDirectory指定FILE_directory_FILE。随后,这两个函数都调用以设置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_分配,打开此“文件”实际上会创建一个NTFS目录。顺便说一句,您还可以将多个命名的$数据流添加到一个目录中。参考主题

接下来创建“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_分配流。这将推翻文件\非\目录\文件标志。你得到你想要的。但不要依赖于此,因为这些流是NTFS的一个实现细节,NTFS不是Windows上使用的唯一文件系统。

您能详细说明为什么会发生这种情况吗?请记住,如果不是很明显的话,我的Python知识充其量也是非常有限的:是否有文档说明为什么不应该在目录上使用os.remove?另外,如果这是强制性的,那么该方法不应该抛出更好的异常吗?@Simeon,在Windows上,os.remove是通过调用来实现的。当目标是目录时,产生的错误是-因此在Python中是PermissionError。这源于底层状态\u FILE\u是\u A\u目录。os.rmdir是通过调用@Simeon来实现的,在较低的级别上,当尝试删除时,会显示错误的原因
通过DeleteFile调用系统服务的目录是在OpenOptions中设置了FILE_NON_directory_FILE,而RemoveDirectory使用FILE_directory_FILE。这是主要的区别。之后,两个API都会调用设置FileDispositionInformation以删除文件或目录。@eryksun非常感谢。这就是我所需要的,你能补充一个答案来提高可视性吗?你能详细说明为什么会发生这种情况吗?请记住,如果不是很明显的话,我的Python知识充其量也是非常有限的:是否有文档说明为什么不应该在目录上使用os.remove?另外,如果这是强制性的,那么该方法不应该抛出更好的异常吗?@Simeon,在Windows上,os.remove是通过调用来实现的。当目标是目录时,产生的错误是-因此在Python中是PermissionError。这源于底层状态\u FILE\u是\u A\u目录。os.rmdir是通过调用@Simeon实现的,在较低的级别上,试图通过DeleteFile删除目录时出错的原因是,它使用OpenOptions中设置的FILE\u NON\u directory\u FILE调用系统服务,而RemoveDirectory使用FILE\u directory\u FILE。这是主要的区别。之后,两个API都会调用设置FileDispositionInformation以删除文件或目录。@eryksun非常感谢。这就是我所需要的,你能补充一个答案吗?谢谢:这是非常详尽的。我希望我能给它更多的投票权。@Simeon,除了我没有演示如何在cdb Python下运行Python外,在目标函数bp kernel32上设置一个断点!DeleteFileW,go g,call os.remove,逐步调用pc,打印x64调用的6个参数r rcx,rdx,r8,r9;dq@rsp+20 l2,使用pt跳转到函数return,并打印线程环境块以查看LastErrorValue窗口和LastStatusValue NT。:D我知道我的感谢评论只是垃圾邮件,但这种质量的答案在SO上很少见到,因此再次感谢。谢谢:这非常详尽。我希望我能给它更多的投票权。@Simeon,除了我没有演示如何在cdb Python下运行Python外,在目标函数bp kernel32上设置一个断点!DeleteFileW,go g,call os.remove,逐步调用pc,打印x64调用的6个参数r rcx,rdx,r8,r9;dq@rsp+20 l2,使用pt跳转到函数return,并打印线程环境块以查看LastErrorValue窗口和LastStatusValue NT。:D我知道我的感谢评论只是垃圾邮件,但在SO上很少看到这种质量的答案,因此再次感谢。