在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]
答案 0 :(得分:8)
最好的办法就是尝试访问它。
您可以计算访问控制列表为特定用户帐户授予的访问权限,但这非常复杂,并且在您执行访问检查后权限可能会更改。所以只需打开文件并处理拒绝访问错误。
答案 1 :(得分:3)
它不会是文件本身的标志,因为不同的帐户可能有权访问不同的文件/目录。相反,Windows使用ACL(访问控制列表),这是确定谁有权访问什么的数据结构。
Windows中的ACL几乎可以与句柄引用的任何内容一起使用(文件,目录,进程,互斥锁,命名管道......)。您可以通过转到文件属性并查看“安全”选项卡来查看文件ACL。
因此,在您的应用中,您并不真正想要检查标志,而是将文件的ACL与运行应用程序的用户帐户进行比较。查看AccessCheck Win32功能。我认为这正是你要找的。 p>
就个人而言,我从来没有使用过这个功能,但是如果你正在寻找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