2011-05-23 61 views
1

我尝试使用_stat()获取文件的权限。目前我想在Windows下运行它。方法如下:在我的代码中,_stat()如何正确工作

bool CFile::Private::checkPermissions(std::string sFilename, CFile::EOpenmode iOpenmode) 
{ 
    std::string sErrMsg = ""; 
    bool bResult = true; 
    struct _stat buf; 
    int iResult = 0; 

    // Get data associated with "crt_stat.c": 
    iResult = _stat(sFilename.c_str(), &buf); 

    // Check if statistics are valid: 
    if(iResult != 0) 
    { 
    switch (errno) 
    { 
     case ENOENT: 
     sErrMsg = "File: " + sFilename + " not found."; 
     break; 
     case EINVAL: 
     sErrMsg = "Invalid parameter to _stat(filename, &buf)."; 
     break; 
     default: 
     /* Should never be reached. */ 
     sErrMsg = "Unexpected error in _stat(filename, &buf)."; 
    } 
    throw std::runtime_error(sErrMsg); 
    } 
    else 
    { 
    if((iOpenmode & CFile::Read) && (!(buf.st_mode & S_IREAD))) 
    { 
     bResult = false; 
    } 
    if((iOpenmode & CFile::Write) && (!(buf.st_mode & S_IWRITE))) 
    { 
     bResult = false; 
    } 
    } 
    return bResult; 
} 

获得'false'权限的唯一方法是将文件的属性设置为'只读'。取而代之的是,将checkPermissions(...)设置为用户的安全属性(拒绝写入和读取)将为'true'。如何检查Windows的属性和用户权限?

入魔

回答

4

_stat是一个非Windows本地的函数。它是帮助UNIX程序移植到Windows的辅助函数。但是UNIX文件模型并不适用于Windows,因此并非所有字段都有意义。例如,Windows具有真实的ACL,而不是rwx位。在st_mode中没有适合所有ACL信息的方法。

如果要测试ACL权限,正确的方法是尝试:请致电CreateFile()并检查GetLastError()。试图获得文件权限是不可靠的,因为他们可以随时更改。

+0

如果文件已经打开,CreateFile忽略它的SECURITY_ATTRIBUTES arg,在这种情况下GetFileSecurity更好。 – 2016-10-25 00:14:12

0

如果我们谈论相同_stat()这是从this MSDN article正是它很清楚。基本上,你为它提供了一个有问题的文件的路径和一个指向_stat结构体的指针,并且它将权限转储给结构体,如果它返回0.

本文中的示例C++代码非常好。

至于测试用户权限,IsUserAnAdmin()做得很好。您可以使用this MSDN article作为其他方法。

我希望这有助于!

+2

'IsUserAnAdmin'是错误的方法;它完全忽略文件的ACL。而且,即使管理员也无权阅读每个文件;它不是UNIX根目录。 – MSalters 2011-05-23 08:52:33

相关问题