2014-11-19 5 views
1

그래서 사람들은, 내가Directory.GetFiles가 휴지통 및 기타 "안전하지 않은"장소를 "확인"하지 못하게하는 방법은 무엇입니까?

System.IO.Directory.GetFiles(string path, string searchPattern, System.IO.SearchOption) 

그것은 잘 작동 나는 드라이브 디렉토리 (D:\ 또는 C:\ 등)을 선택할 때까지 GetFiles 방법을 사용하여 특정 디렉토리의 특정 파일을 검색하는 내 응용 프로그램에서 함수가 될 수있다 그것은 또한 휴지통에 접근 있기 때문에, 검색 한 다음 'D : \ $ RECYCLE.BIN \가 S가-1-5-21-106145493-3722843178-2978326776-1010'이 경로에

액세스 제한 거부를 .

하위 폴더 (SearchOption.AllDirectories)도 검색 할 수 있어야합니다.

어떻게 검색 할 곳을 건너 뛰시겠습니까? 액세스가 거부 된 다른 폴더가있을 수 있기 때문입니다.

시도 캐치와 예외가 잡히면 전체 검색도 실패하므로 SKIP을 대문자로 사용합니다.

감사합니다. 필요한 것을 명확히하십시오.

+1

가능한 중복 : http://stackoverflow.com/questions/1393178/unauthorizedaccessexception-cannot-resolve-directory-getfiles-failure?rq=1 – Maverik

답변

-1

편집 됨 더 명확히하기 위해.

디렉터리 트리를 반복적으로 검색 할 때, 예를 들어 디렉터리가 매개 변수로 시작되도록하는 재귀 적 메서드를 사용하면 디렉터리의 특성을 가져올 수 있습니다. 그런 다음 시스템 디렉토리인지 여부와 "C : \"와 같은 루트 디렉토리가 아닌지 확인하십시오.이 경우 디렉토리 (예 : 휴지통)를 건너 뛰고 싶습니다.

다음은이 작업을 수행하는 코드이며, 디렉토리 검색을 시도 할 때 발생하는 몇 가지 공통적 인 예외도 포착합니다.

void scan_dir(string path) 
{ 
    // Exclude some directories according to their attributes 
    string[] files = null; 
    string skipReason = null; 
    var dirInfo = new DirectoryInfo(path); 
    var isroot = dirInfo.Root.FullName.Equals(dirInfo.FullName); 
    if ( // as root dirs (e.g. "C:\") apparently have the system + hidden flags set, we must check whether it's a root dir, if it is, we do NOT skip it even though those attributes are present 
      (dirInfo.Attributes.HasFlag(FileAttributes.System) && !isroot) // We must not access such folders/files, or this crashes with UnauthorizedAccessException on folders like $RECYCLE.BIN 
     ) 
    { skipReason = "system file/folder, no access"; 
    } 

    if (null == skipReason) 
    { try 
     { files = Directory.GetFiles(path); 
     } 
     catch (UnauthorizedAccessException ex) 
     { skipReason = ex.Message; 
     } 
     catch (PathTooLongException ex) 
     { skipReason = ex.Message; 
     } 
    } 

    if (null != skipReason) 
    { // perhaps do some error logging, stating skipReason 
     return; // we skip this directory 
    } 

    foreach (var f in files) 
    { var fileAttribs = new FileInfo(f).Attributes; 
     // do stuff with file if the attributes are to your liking 
    } 

    try 
    { var dirs = Directory.GetDirectories(path); 
     foreach (var d in dirs) 
     { scan_dir(d); // recursive call 
     } 
    } 
    catch (PathTooLongException ex) 
    { Trace.WriteLine(ex.Message); 
    } 
} 
+0

댓글하시기 바랍니다 downvoters 수 있을까요? 내 제안은 저에게 효과적입니다. 내 전체 드라이브를 스캔하고 루트 이외의 시스템 디렉토리는 피했습니다. 이로 인해 분명히 예상되는 케이스에 예외가 던져지는 것을 막을 수 있었고 이는 나에게 더 좋을 것으로 보인다. – user1847129

+0

(이러한 작업을 처리 할 때 분명히 예외를 잡아야하지만 somethign이 확인하기가 쉽기 때문에 처음부터 처리하지 못하도록하는 것이 좋습니다.) – user1847129

+0

OP 질문이 다소 있음을 알고 있습니다. 이전 링크 및 중복 링크가 게시되었습니다. 나는 다른 곳에 응답을 너무 좋아하지 않았고, 여기에 있었지만 최근에 예외에 의존하도록 제안 된 것을 삭제했다. 분명히 기대되는 것들이 예외를 던지지 않도록 (나는 수천 개의 폴더 스캔 속도를 늦추는 것을) 방지하기를 원하기 때문에 이것을 게시 할 것이라고 생각했습니다. 며칠 전이 문제에 대한 해결책을 직접 찾고 있었기 때문에이 스레드를 발견했습니다. 내가 다른 곳에서 본 것보다 내가 좋아하는 것을 발견 했으므로 다시 돌아왔다. – user1847129