2011-10-17 29 views
1

在win32 C++;有没有办法确定文件夹/文件是否可访问?您知道如果您尝试访问C:/ Windows目录&中的某个文件夹,您将看到一个弹出窗口,显示“该文件夹无法访问”。WinAPI方式确定文件是否可访问/私有

也许有一个文件属性常量,表示该文件是私人的?也许像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] 

回答

2

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

windows中的ACL可以用于处理引用的任何内容(文件,目录,进程,互斥体,命名管道......)。您可以通过转到文件的属性并查看“安全性”选项卡来查看文件ACL。

因此,在您的应用程序中,您并不是真的想要检查标志,而是要将文件的ACL与运行应用程序的用户帐户进行比较。检出AccessCheck Win32函数。我认为这正是你正在寻找的。个人而言,我从来没有使用过这个功能,但是如果您正在寻找Win32解决方案并且想要一个函数调用,那可能是您最好的选择。但是,正如其他人指出的那样,这可能太复杂了。我一直使用_access(或_waccess),它是CRT的一部分,非常易于使用,并且不会仅仅通过获取文件句柄来关闭它(取决于您的循环是多么紧密,这些调用实际上可以加起来)。

+2

是,'AccessCheck'会的工作,但它的复杂和棘手的使用。如果您想知道您是否可以打开文件,最简单的方法就是尝试打开文件并查看是否成功。 –

+0

是啊,我从来没有使用过它,但是OP正在寻找win32调用:)使用另一种替代方法更新了该文章 – DXM

+0

仅获取文件句柄才能关闭它?不,你应该使用文件句柄来做一些有用的事情。如果你不打算使用资源,为什么它的权限很重要? –

7

最好的事情就是尝试访问它。

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

+1

“访问被拒绝”意味着'GetLastError()== 5'。 – MSalters

相关问题