Как проверить, доступен ли каталог для чтения или записи? - PullRequest
0 голосов
/ 13 февраля 2020

Я хочу узнать, доступен ли каталог / папка для чтения или записи. Я искал прямой способ сделать это с помощью функции или тому подобное, но я не нашел его.

Я пытался сделать это косвенно следующим образом:

Доступно для чтения:

WIN32_FIND_DATAA dirData;
HANDLE hDir;
hDir = FindFirstFile("C:\\folder", &dirData);
if (hDir == INVALID_HANDLE_VALUE)
    return false;
return true;

Доступно для записи:

DWORD attr = GetFileAttributes(m_dirPath);
if (attr != INVALID_FILE_ATTRIBUTES && attr & FILE_ATTRIBUTE_READONLY)
    return false;
return true;
  • Первый код является косвенным способом узнать, является ли каталог читаемым, но он неэффективен, потому что, когда каталог пуст, он возвращает 0, который не читается.

  • Второй код для проверки является ли каталог доступным для записи, но он всегда возвращает значение 1, доступное для записи, хотя я изменил разрешение каталога только для чтения.

Существует ли прямой или косвенный способ узнать, каталог для чтения или записи?

1 Ответ

1 голос
/ 13 февраля 2020

Мне нужен способ узнать, является ли каталог / папка доступным для чтения или записи.

Непосредственно для попытки открыть каталог с правами доступа на чтение / запись через CreateFile API:

HANDLE tDir = CreateFile(L"D:\\testNew", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
if (INVALID_HANDLE_VALUE == tDir)
    printf("Open directory failed with error %d \n", GetLastError());
else
    printf("Readable. \n");

tDir = CreateFile(L"D:\\testNew", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
if (INVALID_HANDLE_VALUE == tDir)
    printf("Open directory failed with error %d \n", GetLastError());
else
    printf("Writable. \n");

Если это каталог только для чтения, вы получите сообщение об отказе в доступе при открытии его с помощью GENERIC_WRITE.

Для чтения. только , каталог может быть настроен на запрет текущего пользователя на запись, однако он не предназначен только для чтения. В настоящее время вы получите результат «Этот каталог не только для чтения», но вы по-прежнему не можете писать.

enter image description here

Обновление:

Как указал @RaymondChen, вы можете более точно подтвердить желаемое право доступа к каталогу, используя константы прав доступа к файлу . Возьмите FILE_LIST_DIRECTORY в качестве примера:

tDir = CreateFile(L"D:\\testNew", FILE_LIST_DIRECTORY, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
if (INVALID_HANDLE_VALUE == tDir)
    printf("Open directory failed with error %d \n", GetLastError());
else
    printf("Has right to list the contents of the directory.\n");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...