WinAPI способ определить, является ли файл доступным / закрытым - PullRequest
2 голосов
/ 17 октября 2011

в win32 c ++; Есть ли способ определить, доступна ли папка / файл? Вы знаете, как, если вы попытаетесь получить доступ к определенной папке в каталоге C: / Windows, и у вас появится всплывающее сообщение «Эта папка недоступна».

Может быть, есть константа атрибута файла, которая означает, что файл является закрытым? Может быть, что-то вроде FILE_ATTRIBUTE_PRIVATE?

WIN32_FIND_DATA dirData;

while (FindNextFile( dir, &dirData ) != 0 )
{
    // I made the following constant up
    if ( !(fileData.dwFileAttributes & FILE_ATTRIBUTE_PRIVATE) )
    {
        // file is accessible so store filepath
        files.push_back( fileData.cFileName );
    }
    else // file is not accessible so dont store
}

Или это единственный способ узнать:

dir = FindFirstFileEx( (LPCTSTR)directory.c_str(), FindExInfoStandard, &dirData, FindExSearchNameMatch, NULL, 0 );

if ( dir == ??? ) { the file is inaccessible } [/code]

Ответы [ 3 ]

8 голосов
/ 17 октября 2011

Лучше всего просто попытаться получить к нему доступ.

Вы можете рассчитать доступ, предоставленный списком контроля доступа для конкретной учетной записи пользователя, но это довольно сложно, и разрешение может измениться после того, как высделать проверку доступа.Так что просто откройте файл и обработайте ошибки в доступе.

3 голосов
/ 17 октября 2011

Это не был бы флаг самого файла, потому что разные учетные записи могут иметь доступ к разным файлам / каталогам. Вместо этого в Windows используются ACL (списки контроля доступа), которые представляют собой структуры данных, определяющие, кто к чему имеет доступ.

ACL в окнах могут использоваться практически со всем, на что ссылается дескриптор (файлы, каталоги, процессы, мьютексы, именованные каналы ...). Вы можете просмотреть ACL для файлов, перейдя в свойства файла и перейдя на вкладку «Безопасность».

Таким образом, в вашем приложении вы на самом деле не хотите проверять наличие флага, а должны сравнивать ACL файла с учетной записью пользователя, под которой работает ваше приложение. Проверьте AccessCheck Win32 функции. Я думаю, что это именно то, что вы ищете.

Лично я никогда не использовал эту функцию, но если вы ищете решение для Win32 и хотите вызвать функцию, это, вероятно, ваш лучший выбор. Однако, как отмечали другие, это может быть слишком сложно. Я всегда использовал _access (или _waccess), который является частью CRT, очень прост в использовании, и вы не получаете снижения производительности, получая дескриптор файла только для его закрытия (в зависимости от того, насколько напряженным является ваш цикл, эти вызовы может на самом деле сложить).

1 голос
/ 17 октября 2011
int _access( 
   const char *path, 
   int mode 
);

Прост в использовании:

http://msdn.microsoft.com/en-us/library/1w06ktdy%28v=vs.80%29.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...