Проверка прав доступа к файлу / папке - PullRequest
9 голосов
/ 11 августа 2010

Я получаю UnautorizedAccessException с этим кодом:

string[] fileList = Directory.GetFiles(strDir, strExt);

Исключение возникает в c:\users\username\appdata Как я могу проверить, есть ли у меня разрешение на доступ (для просмотра и чтения файлов)?

Ответы [ 3 ]

9 голосов
/ 11 августа 2010

Прежде всего, я бы вручную проверил разрешения и увидел, что блокирует вас, а что нет. Я использую что-то вроде этого для проверки прав доступа (для файла копирования):

AuthorizationRuleCollection acl = fileSecurity.GetAccessRules(true, true,typeof(System.Security.Principal.SecurityIdentifier));
bool denyEdit = false;
for (int x = 0; x < acl.Count; x++)
{
    FileSystemAccessRule currentRule = (FileSystemAccessRule)acl[x];
    AccessControlType accessType = currentRule.AccessControlType;
    //Copy file cannot be executed for "List Folder/Read Data" and "Read extended attributes" denied permission
    if (accessType == AccessControlType.Deny && (currentRule.FileSystemRights & FileSystemRights.ListDirectory) == FileSystemRights.ListDirectory)
    {
        //we have deny copy - we can't copy the file
        denyEdit = true;
        break;
    }
... more checks 
}

Кроме того, существуют некоторые странные случаи, когда определенное право на папку меняет право на файлы независимо от их индивидуальных разрешений (посмотрим, смогу ли я найти, что это).

4 голосов
/ 11 августа 2010

Проверьте статью о проекте кода, которая посвящена тому, что вам нужно, класс, созданный для этого: Цель этого класса - дать простой ответ на распространенный вопрос: «Есть ли у меня разрешение на чтение или запись этого файла ?».

Простой способ проверить индивидуальные права доступа для данного файла и пользователя

Примечание: здесь нельзя разместить весь код, потому что он слишком длинный.

3 голосов
/ 11 августа 2010

Сначала вызовите Directory.GetFiles для корневого каталога. Catch UnauthorizedAccessException - если его нет, у вас есть полный доступ.

Если поймано - рекурсивно вызывать функцию для каждого subdir, ловить исключение, если поймано - добавить такой dir в список.

Написать рекурсивную функцию с внешним списком для запрещенных папок

...