C#:Как проверить, могу ли я прочитать и / или удалить каталог

StackOverflow https://stackoverflow.com/questions/1604183

  •  05-07-2019
  •  | 
  •  

Вопрос

Я рекурсивно перебираю кучу каталогов.Некоторые из них (например D:\$ПЕРЕРАБОТАТЬ.КОРЗИНА \S-1-5-20) дай мне System.UnauthorizedAccessException.Я полагаю, что я могу просто поймать это и двигаться дальше, но я бы предпочел выяснить это заранее.

Итак, когда у меня есть DirectoryInfo объект.Как я могу узнать, разрешено ли мне GetDirectories() и , возможно, Delete() это?

Это было полезно?

Решение

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

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

Другие советы

Я создал следующий код.Пожалуйста, посмотрите, поможет ли это:

//using System.IO;
//using System.Security.AccessControl;
//using System.Security.Principal;

string[] directories = Directory.GetDirectories(
    Path.Combine(Environment.CurrentDirectory, @"..\.."), 
    "*", SearchOption.AllDirectories);
foreach (string directory in directories)
{
    DirectoryInfo info = new DirectoryInfo(directory);
    DirectorySecurity security = info.GetAccessControl();
    Console.WriteLine(info.FullName);
    foreach (FileSystemAccessRule rule in 
             security.GetAccessRules(true, true, typeof(NTAccount)))
    {
        Console.WriteLine("\tIdentityReference = {0}", rule.IdentityReference);
        Console.WriteLine("\tInheritanceFlags  = {0}", rule.InheritanceFlags );
        Console.WriteLine("\tPropagationFlags  = {0}", rule.PropagationFlags );
        Console.WriteLine("\tAccessControlType = {0}", rule.AccessControlType);
        Console.WriteLine("\tFileSystemRights  = {0}", rule.FileSystemRights );
        Console.WriteLine();
    }
}

Результат:

D:\Projects\ConsoleApplication1\bin
    IdentityReference = BUILTIN\Administrators
    InheritanceFlags  = ContainerInherit, ObjectInherit
    PropagationFlags  = None
    AccessControlType = Allow
    FileSystemRights  = FullControl

Обратите внимание , что IdentityReference и FileSystemRights свойства;вероятно, вам следует протестировать свой текущий ACL на соответствие им, прежде чем пытаться удалить каталог.

Полагаю, вам нужно написать собственный метод GetDirectories () ; который рекурсивно получает те, которые внутри него.

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

Проще говоря, System.IO.Directory.GetDirectories () будет давать сбой каждый раз, когда получит одно из этих исключений.

Код примерно такой (скопированный сверху) должен помочь вам начать

    List<String> directories = new List<String>();
    void DirSearch(string sDir) 
    {
        try 
        {
            foreach (string d in Directory.GetDirectories(sDir)) 
            {
                //foreach (string f in Directory.GetFiles(d, txtFile.Text)) 
                //{
                //    
                //}
                // use this to search for files recursivly.
                directories.Add(d);
                DirSearch(d);
            }
        }
        catch (System.Exception excpt) 
        {
            Console.WriteLine(excpt.Message);
        }
    }

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

Я нашел это, пытаясь решить проблему...

Кажется связанным, но довольно не поддерживаемым кодом, я его не пробовал

http://technolog.nl/blogs/eprogrammer/archive/2009/06/18/Howto_3A00_-Properly-use-the-AccessCheck-API.aspx

с уважением

Марио

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top