无法返回列表<文件信息>对象

本文关键字:信息 对象 文件 返回 列表 | 更新日期: 2023-09-27 18:31:15

我试图通过递归搜索任意目录来返回 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,这就可以了。如果可能的话,希望使用文件类型的列表。

谢谢。

无法返回列表<文件信息>对象

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

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

为什么不直接使用 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();
}