我尝试使用线程构建递归目录搜索,但不知何故它不起作用,如果我尝试使用线程,它确实有效,我不明白为什么。在网上搜索了servel的地方,但是如果你看到/ * * /里面的方法是什么,那么没有找不到解决我问题的方法。
class Program
{
private static List<string> files = new List<string>();
public static bool FolderContainName(DirectoryInfo source, string name)
{
FileInfo[] files = source.GetFiles(name);
return (files.Length <= 0);
}
public static void FileLocataion(DirectoryInfo source, string sFileName)
{
if (!FolderContainName(source,sFileName))
{
files.Add(source.ToString());
}
DirectoryInfo [] newSource = source.GetDirectories();
if (newSource.Length>0)
{
for(int i = 0 ; i < newSource.Length; i++)
{
Thread a = new Thread(() => FileLocataion(newSource[i],sFileName));
a.Start();
}
}
/*if (!FolderContainName(source, sFileName))
{
files.Add(source.ToString());
}
DirectoryInfo[] newSource = source.GetDirectories();
if (newSource.Length > 0)
{
for (int i = 0; i < newSource.Length; i++)
{
FileLocataion(newSource[i], sFileName);
}
}*/
}
static void Main(string[] args)
{
Console.WriteLine("Enter locataion:");
DirectoryInfo source = new DirectoryInfo(Console.ReadLine());
Console.WriteLine("Enter file name:");
string fileName = Console.ReadLine();
files.Clear();
FileLocataion(source, fileName);
for (int i = 0; i < files.Count;i++ )
Console.WriteLine(files[i]);
}
}
答案 0 :(得分:2)
首先,每个线程都试图将内容添加到List
,这不是线程安全的。例如,使用System.Collections.Concurrent
其次,FileLocation
几乎会立即返回,并且您试图在构造之前读取结果。看看Task
和async/await
,这将有助于您处理。
This article是一个好的开始。
哦,顺便说一句,C#中已经内置了用于递归列出目录的功能:
var myFiles = Directory.GetFiles(extractPath, "*.*", SearchOption.AllDirectories);