Windows下的_stat()如何正常工作

时间:2011-05-23 08:29:06

标签: c++ windows stat

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

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的属性和用户权限?

入魔

2 个答案:

答案 0 :(得分:5)

_stat是一个非Windows原生功能。它是一个辅助功能,可以简化UNIX程序到Windows的移植。但UNIX文件模型不适用于Windows,因此并非所有字段都有意义。例如,Windows具有真正的ACL,而不是rwx位。没有办法在st_mode中填入所有ACL信息。

如果您想测试ACL权限,正确的方法是尝试:调用CreateFile()并检查GetLastError()。尝试预先获得文件权限并不可靠,因为它们可以随时更改。

答案 1 :(得分:0)

如果我们谈论相同的_stat(),那么从this MSDN article确切地知道它的作用就很清楚了。基本上,您为它提供了一个有问题的文件的路径和一个指向_stat结构的指针,如果它返回0,它将转储该结构的权限。

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

至于测试用户权限,IsUserAnAdmin()可以很好地完成工作。您可以使用this MSDN article进行其他方法。

我希望这有帮助!