2014-11-21 4 views
0

Я пытаюсь вернуть список типов FileInfo путем поиска в произвольной директории рекурсивно. Тем не менее, в моем основном() методе, когда я проверяю, есть ли счет FoundFiles, это означает, что я вернул пустой объект. См код ниже:Невозможно вернуть Список <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, чтобы проверить содержимое FileInfoList до моего возвращения, и он будет содержать файлы. Однако в нем нет ничего основного. Я новичок в нюансах C#, поэтому извиняюсь, если это довольно легко.

Кроме того, стоит отметить, что если я использую Type List со строкой вместо FileInfo, это работает отлично. Надеемся использовать Список типов FileInfo, если это возможно.

Спасибо.

ответ

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(); 
} 

Но! В ответ на ваш вопрос вы звоните List<FileInfo> FoundFiles = new List<FileInfo>(); каждый раз, когда звоните SearchFileSystem(...). Затем вы вызываете метод рекурсивно, но не используете никаких результатов.

Если вы хотите использовать существующий код, вот необходимые изменения, которые я бы сделать:

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#. Только с structs вам нужно явно указать, что вы передаете ref или out. Это не плохая идея для объектов, потому что в ней говорится о намерении, но для очень упрощенного кода, как это, я обычно пропускаю. – techvice

2

Вы не добавляете результаты из рекурсивных вызовов. Так что в идеале вы получаете результаты только последнего каталога, который не может иметь несколько файлов .. Попробуйте это:

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

Хороший вызов. Я не смотрел, где храню данные. На данный момент мой список Global List сделал трюк. – corneria

 Смежные вопросы

  • Нет связанных вопросов^_^