0

我试图通过递归搜索任意目录来返回 FileInfo 类型的列表。但是,在我的 main() 方法中,当我检查 FoundFiles 的计数时,它是 0,这意味着我返回了一个空对象。请参阅下面的代码:

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# 的细微差别不熟悉,所以如果这很容易,我深表歉意。

此外,值得注意的是,如果我使用带字符串的 List 类型而不是 FileInfo,则效果很好。如果可能,希望使用 FileInfo 类型的列表。

谢谢。

4

2 回答 2

2

您没有添加递归调用的结果。因此,理想情况下,您只能从可能没有某些文件的最后一个目录中获取结果。试试这个:

foreach (DirectoryInfo SubdirInfo in DirInfo.GetDirectories())
            {
                FileInfoList.AddRange(SearchFileSystem(SubdirInfo, FileList));
            }
于 2014-11-21T05:04:21.547 回答
1

为什么不直接使用该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();
}
于 2014-11-21T05:05:00.797 回答