C#: 디렉토리를 읽거나 삭제할 수 있는지 확인하는 방법
-
05-07-2019 - |
문제
나는 많은 디렉토리를 재귀 적으로 고리합니다. 그들 중 일부 (같은 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);
}
}
디렉토리 목록이 있으면 디렉토리 목록이 있으면 작업을 수행 할 수 있습니다. 일부 모드로 위의 방법으로 목록의 내용에 대한 읽기 권한이 있는지 확인해야합니다.
문제를 해결하려고 노력하는 동안 이것을 찾았습니다 ...
관련된 것 같습니다.하지만 꽤 유지되지 않은 코드, 나는 그것을 시도하지 않았습니다.
문안 인사
마리오