문제

나는 많은 디렉토리를 재귀 적으로 고리합니다. 그들 중 일부 (같은 D : $ Recycle.Bin 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-accesscheck-api.aspx

문안 인사

마리오

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top