无法返回列表<文件信息>对象
本文关键字:信息 对象 文件 返回 列表 | 更新日期: 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();
}