2014-11-21 8 views
0

임의의 디렉터리를 재귀 적으로 검색하여 FileInfo 형식의 목록을 반환하려고합니다. 그러나, 내 main() 메서드에서 FoundFiles의 수를 확인하기 위해 검사 할 때 빈 개체를 반환한다는 의미는 0입니다. List <FileInfo> 개체를 반환 할 수 없습니다.

using System; 
using System.IO; 
using System.Collections.Generic; 

class FindExtensions 
{ 
    private static List<FileInfo> SearchFileSystem(DirectoryInfo DirInfo, List<FileInfo> FileList) 
    { 
     List<FileInfo> FileInfoList = new List<FileInfo>(); 
     try 
     { 
      foreach (DirectoryInfo SubdirInfo in DirInfo.GetDirectories()) 
      { 
       SearchFileSystem(SubdirInfo, FileList); 
      } 
     } 
     catch 
     { 
      // do some stuff 
     } 
     try 
     { 
      foreach (FileInfo File in DirInfo.GetFiles()) 
      { 
       FileInfoList.Add(File); 
      } 
     } 
     catch 
     { 
      // do some stuff 
     } 


     foreach (FileInfo f in FileInfoList) 
     { 
      Console.WriteLine(f.FullName); 
     } 

     return FileInfoList; 

    } 

    static void Main() 
    { 

     DirectoryInfo dir_info = new DirectoryInfo(@"C:\<whatever>"); 
     List<FileInfo> file_list = new List<FileInfo>(); 

     List<FileInfo> FoundFiles = SearchFileSystem(dir_info, file_list); 

     Console.WriteLine("Count is: " + FoundFiles.Count); 

     //^^^^ this returns 0...why is it empty? 

     Console.WriteLine("This is the debug mode. Press key to restart"); 
     Console.ReadKey(); 
    } 
} 

은 내가 그것을 반환하기 전에 SearchFileSystem 방법에 for 루프가 FileInfoList의 내용을 확인하기 위해 추가하고 파일을 포함합니다 : 아래 코드를 참조하십시오. 그러나 메인에는 아무것도 들어 있지 않습니다. 나는 C#의 미묘한 차이에 익숙하다.

또한 FileInfo 대신 string 형식의 List를 사용하면이 방법이 유용합니다. 가능한 경우 FileInfo 형식의 List를 사용하려고합니다.

감사합니다.

답변

2

왜 그냥 GetFiles() 방법을 사용하지 그것이 당신

static void Main() 
{ 

    DirectoryInfo dir_info = new DirectoryInfo(@"C:\<whatever>"); 
    List<FileInfo> file_list = new List<FileInfo>(); 

    //This will add all the files in all directories. You can customize the search from here as well. 
    file_list.AddRange(dir_info.GetFiles("*", SearchOption.AllDirectories)); 
    Console.WriteLine("Count is: " + file_list.Count); 

    //^^^^ this returns 0...why is it empty? 

    Console.WriteLine("This is the debug mode. Press key to restart"); 
    Console.ReadKey(); 
} 
에 대한 작업을 할 수 있도록 : 그래서 이상적으로 일부 파일이 없을 수 있습니다 마지막 디렉토리에서 결과를 얻고있다 ..이 시도

하지만! 질문에 대한 답변으로 SearchFileSystem(...)에 전화 할 때마다 List<FileInfo> FoundFiles = new List<FileInfo>();으로 전화를 걸고 있습니다. 그런 다음 메서드를 재귀 적으로 호출하지만 거기에서 결과를 사용하지 마십시오.

private static void SearchFileSystem(DirectoryInfo DirInfo, List<FileInfo> FileList) 
{ 
    try 
    { 
     foreach (DirectoryInfo SubdirInfo in DirInfo.GetDirectories()) 
     { 
      SearchFileSystem(SubdirInfo, FileList); 
     } 
    } 
    catch 
    { 
     // do some stuff 
    } 

    //Since we are passing in FileList, let's use it instead of a new list. 
    try 
    { 
     foreach (FileInfo File in DirInfo.GetFiles()) 
     { 
      FileList.Add(File); 
     } 
    } 
    catch 
    { 
     // do some stuff 
    } 


    foreach (FileInfo f in FileList) 
    { 
     Console.WriteLine(f.FullName); 
    } 
} 

static void Main() 
{ 

    DirectoryInfo dir_info = new DirectoryInfo(@"C:\<whatever>"); 
    List<FileInfo> file_list = new List<FileInfo>(); 

    SearchFileSystem(dir_info, file_list); 

    Console.WriteLine("Count is: " + FoundFiles.Count); 

    //^^^^ this returns 0...why is it empty? 

    Console.WriteLine("This is the debug mode. Press key to restart"); 
    Console.ReadKey(); 
} 
+0

위 내용을 설명 했어야하지만 프로그램을 실행하는 사용자에게 무단 액세스 권한이있는 파일을 고려해야합니다. 따라서 재귀 적 전략. 그래도 AddRange 메서드를 사용하겠습니다. – corneria

+0

고맙습니다! 대단히 감사합니다. – corneria

+1

@PiyushParashar 개체는 C#에서 참조로 전달되도록 기본값으로 설정됩니다. 구조체를 사용하는 경우에만 ref 또는 out으로 전달한다는 명시 적으로 명시해야합니다. 이것은 의도를 기술했기 때문에 객체에 대해서도 나쁜 생각이 아니지만 일반적으로 건너 뛰는 이와 같은 매우 단순한 코드에 대해서입니다. – techvice

2

재귀 호출 결과를 추가하지 않습니다.

foreach (DirectoryInfo SubdirInfo in DirInfo.GetDirectories()) 
      { 
       FileInfoList.AddRange(SearchFileSystem(SubdirInfo, FileList)); 
      } 
+0

좋은 전화 : 당신이 당신의 기존 코드를 사용하려면

, 여기에 내가 만들어 주겠다고 필요한 사항입니다. 나는 데이터를 저장하고있는 곳을보고 있지 않았다. 이제 내 List를 전역 변수로 만드는 것이 트릭입니다. – corneria