2014-11-21 33 views
0

我想通过递归搜索任意目录来返回FileInfo类型的列表。但是,在我的main()方法中,当我查看FoundFiles的计数时,它是0意味着我返回了一个空对象。请参见下面的代码:无法返回列表<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#的细微差别很陌生,所以很抱歉,如果这很容易。

另外,值得注意的是,如果我使用带有字符串而不是FileInfo的List类型,这很好。如果可能,希望使用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(); 
} 
做的工作

但是!在回答您的问题时,每次拨打电话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 2014-11-21 05:17:31

+0

谢谢先生!不胜感激。 – corneria 2014-11-21 05:24:19

+1

@PiyushParashar对象默认在C#中通过引用传递。只有使用结构体时,你需要明确声明你通过ref或out传递。这对于对象来说也不是一个坏主意,因为它说明了意图,但是对于这样的非常简单的代码,我通常会跳过。 – techvice 2014-11-21 05:28:20

2

您不会添加递归调用的结果。所以最好你都可以从只有最后一个目录的结果可能不会有一些文件..试试这个:

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

良好的通话。我没有看到我存储数据的位置。现在让我的List成为一个全局变量。 – corneria 2014-11-21 05:18:16