为什么我无法使用CreateFile Win32 API打开文件RW,但可以使用std::remove将其删除? < >我的C++应用程序在Windows 10下运行,用户 系统< /代码> 。我尝试使用Win32 api CreateFile使用访问权限打开一个只读文件GENERIC\u READ | GENERIC\u WRITE,从函数调用中获取一个无效的处理程序值

为什么我无法使用CreateFile Win32 API打开文件RW,但可以使用std::remove将其删除? < >我的C++应用程序在Windows 10下运行,用户 系统< /代码> 。我尝试使用Win32 api CreateFile使用访问权限打开一个只读文件GENERIC\u READ | GENERIC\u WRITE,从函数调用中获取一个无效的处理程序值,c++,windows,winapi,stl,C++,Windows,Winapi,Stl,但是,同一程序可以通过对std::remove()的简单调用来删除所述文件 我的猜测是,C标准库中的函数不检查用户访问权限,允许您从程序的任何执行级别自由访问FS,但我不是100%确信,也无法在网上找到这方面的证据 任何OS/STL大师都能解开这个小谜团吗?Windows有特定的删除权限(与FAT文件系统无关,但本机在NTFS上实现)。它们独立于写入权限。权限可能存在于文件本身或从父级(即目录)继承 在Unix和Linux上,情况略有不同;文件删除通过父目录上的写入权限在那里处理 Windows

但是,同一程序可以通过对
std::remove()
的简单调用来删除所述文件

我的猜测是,C标准库中的函数不检查用户访问权限,允许您从程序的任何执行级别自由访问FS,但我不是100%确信,也无法在网上找到这方面的证据


任何OS/STL大师都能解开这个小谜团吗?

Windows有特定的
删除权限(与FAT文件系统无关,但本机在NTFS上实现)。它们独立于
写入
权限。权限可能存在于文件本身或从父级(即目录)继承


在Unix和Linux上,情况略有不同;文件删除通过父目录上的写入权限在那里处理

Windows具有特定的
DELETE
权限(与FAT文件系统无关,但本机在NTFS上实现)。它们独立于
写入
权限。权限可能存在于文件本身或从父级(即目录)继承


在Unix和Linux上,情况略有不同;文件删除通过父目录上的写入权限在那里处理

“我猜STL不会检查用户访问权限”-它没有任何选择,(我希望!)。这些权限/特权是由底层操作系统强制执行的。这个特殊的
remove
来自C标准库,而不是STL。我猜STL不会检查用户访问权限-它没有任何选择,(我希望!)。这些权限/特权由底层操作系统强制执行。此特定的
remove
来自C标准库,而不是STL。不需要(也不够)对目录的写入权限。在windows上查看此-文件系统首先检查对目标文件的访问权限。如果它存在-一切正常,我们可以删除(除了文件是只读的,或在文件上创建的节)。如果我们对目标没有
删除
访问权限。文件系统对父文件夹执行附加检查,以访问
文件\u删除\u子文件夹。如果存在-再次授予删除权限。并且存在几种删除文件的方式。仅适用于
ZwDeleteFile
这是enough@RbMm,对于WinAPI
DeleteFile
,仅获取delete访问权限就足够了。首先,它尝试同时获取delete和read attributes访问权限,如果允许对文件进行访问,或者如果父目录允许delete child和list directory(对于read attributes)访问,则访问将成功。如果无法获得读取属性访问权限,它将使用“删除”访问权限重试。在这种情况下,它将永远不会跟随任何重新分析点,而通常它希望读取属性访问权限避免只跟随符号链接重新分析点。@MSalters,您是否可以将措辞更改为“从父级获取”,而不是“从父级继承”?它实际上不是遗传的。文件系统必须单独评估父目录上的访问检查以检查是否有删除子访问。@MSalters、delete access和delete child access可以从父目录继承到文件和子目录,但这与评估父目录上的delete child access以检查文件的删除访问无关。如果您通过
AccessCheck
手动评估访问,这一点很重要。仅仅获取文件的安全描述符是不够的;您可能还需要获得父级的安全性,并执行第二次
AccessCheck
。不需要(也不够)对目录的写入权限。在windows上查看此-文件系统首先检查对目标文件的访问权限。如果它存在-一切正常,我们可以删除(除了文件是只读的,或在文件上创建的节)。如果我们对目标没有
删除
访问权限。文件系统对父文件夹执行附加检查,以访问
文件\u删除\u子文件夹。如果存在-再次授予删除权限。并且存在几种删除文件的方式。仅适用于
ZwDeleteFile
这是enough@RbMm,对于WinAPI
DeleteFile
,仅获取delete访问权限就足够了。首先,它尝试同时获取delete和read attributes访问权限,如果允许对文件进行访问,或者如果父目录允许delete child和list directory(对于read attributes)访问,则访问将成功。如果无法获得读取属性访问权限,它将使用“删除”访问权限重试。在这种情况下,它将永远不会跟随任何重新分析点,而通常它希望读取属性访问权限避免只跟随符号链接重新分析点。@MSalters,您是否可以将措辞更改为“从父级获取”,而不是“从父级继承”?它实际上不是遗传的。文件系统必须单独评估父目录上的访问检查以检查是否有删除子访问。@MSalters、delete access和delete child access可以从父目录继承到文件和子目录,但这与评估父目录上的delete child access以检查文件的删除访问无关。如果您通过
AccessCheck
手动评估访问,这一点很重要。仅仅获取文件的安全描述符是不够的;您可能还需要获取家长的安全性,并执行第二次
AccessCheck