WinAPI确定文件是否可访问/私有的方法

时间:2011-10-17 03:38:07

标签: c++ winapi

在win32 c ++中;有没有办法确定文件夹/文件是否可访问?您知道如果您尝试访问C:/ Windows目录中的某个文件夹&你会得到一个弹出窗口,上面写着“这个文件夹不可访问”。

也许有一个文件属性常量表示该文件是私有的?也许像FILE_ATTRIBUTE_PRIVATE?

WIN32_FIND_DATA dirData;

while (FindNextFile( dir, &dirData ) != 0 )
{
    // I made the following constant up
    if ( !(fileData.dwFileAttributes & FILE_ATTRIBUTE_PRIVATE) )
    {
        // file is accessible so store filepath
        files.push_back( fileData.cFileName );
    }
    else // file is not accessible so dont store
}

或者是唯一可以通过以下方式了解的方式:

dir = FindFirstFileEx( (LPCTSTR)directory.c_str(), FindExInfoStandard, &dirData, FindExSearchNameMatch, NULL, 0 );

if ( dir == ??? ) { the file is inaccessible } [/code]

3 个答案:

答案 0 :(得分:8)

最好的办法就是尝试访问它。

您可以计算访问控制列表为特定用户帐户授予的访问权限,但这非常复杂,并且在您执行访问检查后权限可能会更改。所以只需打开文件并处理拒绝访问错误。

答案 1 :(得分:3)

它不会是文件本身的标志,因为不同的帐户可能有权访问不同的文件/目录。相反,Windows使用ACL(访问控制列表),这是确定谁有权访问什么的数据结构。

Windows中的ACL几乎可以与句柄引用的任何内容一起使用(文件,目录,进程,互斥锁,命名管道......)。您可以通过转到文件属性并查看“安全”选项卡来查看文件ACL。

因此,在您的应用中,您并不真正想要检查标志,而是将文件的ACL与运行应用程序的用户帐户进行比较。查看AccessCheck Win32功能。我认为这正是你要找的。

就个人而言,我从来没有使用过这个功能,但是如果你正在寻找Win32解决方案而你想要一个函数调用,那么这可能是你最好的选择。但是,正如其他人所指出的那样,它可能过于复杂。我总是使用_access(或_waccess),它是CRT的一部分,uber易于使用,并且你不会仅仅为了关闭它而获取文件句柄的性能(取决于你的循环有多紧,这些调用实际上可以加起来。)

答案 2 :(得分:1)

int _access( 
   const char *path, 
   int mode 
);

简单易用:

http://msdn.microsoft.com/en-us/library/1w06ktdy%28v=vs.80%29.aspx