Как _stat () под Windows точно работает - PullRequest
1 голос
/ 23 мая 2011

В своем коде я пытаюсь получить разрешения для файла с помощью _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» для разрешения - установить атрибут файла «только для чтения».Вместо этого, установить свойства безопасности пользователя (отклонить запись и чтение) получит «true» для checkPermissions (...).Как проверить и атрибуты, и права пользователя для Windows?

Rumo

Ответы [ 2 ]

5 голосов
/ 23 мая 2011

_stat - это функция, которая не является родной для Windows.Это вспомогательная функция, облегчающая перенос программ UNIX в Windows.Но файловая модель UNIX просто не применима к Windows, поэтому не все поля имеют смысл.Например, в Windows есть реальные ACL, а не rwx биты.Просто нет способа уместить всю информацию ACL в st_mode.

. Если вы хотите проверить разрешения ACL, просто попробуйте: позвоните CreateFile() и проверьте GetLastError().Попытки получить права доступа к файлам не надежны, так как они могут измениться в любое время.

0 голосов
/ 23 мая 2011

Если мы говорим об одном и том же _stat (), то из этой статьи MSDN совершенно ясно, что именно он делает.По сути, вы указываете ему путь к рассматриваемому файлу и указатель на структуру _stat, и он выдаст разрешения на структуру, если вернет 0.

Пример кода C ++ в статье довольно хорош.

Что касается тестирования пользовательских разрешений, IsUserAnAdmin () выполняет свою работу довольно хорошо.Возможно, вы сможете использовать эту статью MSDN для другого подхода.

Надеюсь, это поможет!

...