2009-10-10 2 views
1

이 방법은 하위 디렉터리 중 하나가 비어 있지 않으면 파일, 디렉터리 및 하위 디렉터리와 그 내용을 가져 오는 작업입니다.빈 하위 디렉터리가있을 때 GetAllFilesAndDirectories 메서드 디버깅

public static IEnumerable<FileSystemInfo> GetAllFilesAndDirectories (string dir) { 

     DirectoryInfo dirInfo = new DirectoryInfo(dir); 
     Stack<FileSystemInfo> stack = new Stack<FileSystemInfo>(); 

     stack.Push(dirInfo); 
     while (dirInfo != null || stack.Count > 0) { 
      FileSystemInfo fileSystemInfo = stack.Pop(); 
      DirectoryInfo subDirectoryInfo = fileSystemInfo as DirectoryInfo; 
      if (subDirectoryInfo != null) { 
       yield return subDirectoryInfo; 
       foreach (FileSystemInfo fsi in subDirectoryInfo.GetFileSystemInfos()) { 
        stack.Push(fsi); 
       } 
       dirInfo = subDirectoryInfo; 
      } else { 
       yield return fileSystemInfo; 
       dirInfo = null; 
      } 
     } 

} 

는 예외입니다 :

System.InvalidOperationException은 = 처리되지 않은 메시지였다 "빈 스택." 출처 = "시스템"

수정 방법은 무엇입니까?

답변

0

question you asked a little while ago에 대한 또 다른 대답을 추가했습니다.이 답변을 사용하면 여기에서 사용하는 것과 완전히 다른 (읽기 쉬운) 코드 비트를 사용하게되므로이 문제를 방지하는 데 도움이됩니다.

그러나 시간을 절약하기 위해 파일/디렉토리를 재귀 적으로 읽는 다른 방법에 대해이 기사를 확인하십시오.

http://support.microsoft.com/kb/303974

I이없는이 질문에 대한 해답이되어 실현, 그런데 왜 다루기 쉽게 완벽하게 실행 가능한 해결책이있을 때 버그의 솔루션을 고정 시간을 보내고?

0

이 코드를 제안 할 수 있습니다 :

static IEnumerable<FileSystemInfo> GetAllFilesAndDirectories(string path) 
{ 
    string currentDirectory = ""; 
    string[] files = Directory.GetFiles(// skip empty subfolders 
     path, "*.*", SearchOption.AllDirectories); 
    foreach (string file in files) 
    { 
     if(currentDirectory != Path.GetDirectoryName(file)) 
     { 
      // First time in this directory: return it 
      currentDirectory = Path.GetDirectoryName(file); 
      yield return new DirectoryInfo(currentDirectory); 
     } 

     yield return new FileInfo(file); 
    } 
} 

static void Main(string[] args) 
{ 
    foreach (FileSystemInfo info in GetAllFilesAndDirectories(@"c:\intel")) 
    { 
     Console.WriteLine("{0} ({1})", info.FullName, info.Attributes); 
    } 
} 

이 뜻을 표시 : 당신이 List<> 싶어 경우

 
c:\intel\Logs (Directory) 
c:\intel\Logs\IntelChipset.log (Archive) 
c:\intel\Logs\IntelGFX.log (Archive) 
c:\intel\Logs\IntelStor.log (Archive) 
c:\intel\ExtremeGraphics\CUI\Resource (Directory) 
c:\intel\ExtremeGraphics\CUI\Resource\igfxres.dll (Archive) 

, 단지 전화

0
while (stack.Count > 0) 

당신의 동안이와 함께 일하고있다 .ToList() 방법 스택.
하위 디렉토리에서 수집을 시작하더라도 스택이 비어 있지 않습니다.

디렉토리 목록의 끝에있는 빈 하위 디렉토리와 하위 디렉토리에서 수집 할 때 스택이 비어있어 계속 검색 할 이유가 없습니다.
전체 고정 코드는 다음과 같습니다

public static IEnumerable<FileSystemInfo> GetAllFilesAndDirectories(string dir) 
    { 
     DirectoryInfo dirInfo = new DirectoryInfo(dir); 
     Stack<FileSystemInfo> stack = new Stack<FileSystemInfo>(); 
     stack.Push(dirInfo); 
     while (stack.Count > 0) 
     { 
      FileSystemInfo fileSystemInfo = stack.Pop(); 
      DirectoryInfo subDirectoryInfo = fileSystemInfo as DirectoryInfo; 
      if (subDirectoryInfo != null) 
      { 
       yield return subDirectoryInfo; 
       foreach (FileSystemInfo fsi in subDirectoryInfo.GetFileSystemInfos()) 
       { 
        stack.Push(fsi); 
       } 
      } 
      else 
      { 
       yield return fileSystemInfo; 
      } 
     } 
    } 
1

변경 || while 루프에서 & &으로 변경하십시오.

관련 문제