Pregunta

En mi código que tratar de conseguir los permisos para un archivo con _stat().Actualmente quiero que funcione bajo Windows.El método es como sigue:

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;
}

La única manera de obtener 'false' para que el permiso es para establecer el atributo del archivo de 'sólo lectura'.En lugar de esto, establezca las propiedades de seguridad del usuario (rechazar la escritura y la lectura) tendrá 'true' para checkPermissions(...).Cómo comprobar tanto, los atributos y los permisos de usuario para Windows?

Rumo

¿Fue útil?

Solución

_stat es una función que no es nativo de Windows.Es una función auxiliar para facilitar la migración de programas de UNIX a Windows.Pero el archivo de UNIX modelo no se aplica solamente a Windows, por lo que no todos los campos de sentido.Por ejemplo, Windows tiene real ACL, no rwx bits.Simplemente no hay manera de encajar todas las ACL de la información en st_mode.

Si desea probar permisos de ACL, la forma correcta es solo para tratar:llame CreateFile() y de verificación GetLastError().Tratando de obtener los permisos de archivo de frente no es confiable, ya que puede cambiar en cualquier momento.

Otros consejos

Si estamos hablando del mismo _STAT () está bastante claro de este artículo de MSDN exactamente lo que hace.Básicamente, suministra un camino a un archivo en cuestión y un puntero a una estructura _STAT y eliminará los permisos a la estructura si devuelve 0.

El código C ++ del ejemplo en el artículo es bastante bueno.

En cuanto a la prueba de los permisos de usuario, isuseranadmin () hace bastante bien el trabajo.Es posible que pueda usarla este artículo de MSDN para un enfoque diferente.

¡Espero que esto ayude!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top