_stat()在windows下是如何工作的

在我的代码中,我尝试使用_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; } 

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

入魔

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

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

如果我们正在讨论相同的_stat(),那么从这篇MSDN文章中可以清楚地看到它的功能。 基本上,你提供了一个文件的路径和一个指向_stat结构的指针,如果它返回0,它将权限转储给结构体。

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

至于测试用户权限, IsUserAnAdmin()做的很好。 您可能能够使用此MSDN文章不同的方法。

我希望这有帮助!