我有一个每晚都要运行的工作,从根目录下有超过20,000个子文件夹的目录中提取xml文件.这是结构的样子:
rootFolder/someFolder/someSubFolder/xml/myFile.xml
rootFolder/someFolder/someSubFolder1/xml/myFile1.xml
rootFolder/someFolder/someSubFolderN/xml/myFile2.xml
rootFolder/someFolder1
rootFolder/someFolderN
Run Code Online (Sandbox Code Playgroud)
所以看看上面的结构,结构总是一样的 - 一个根文件夹,然后是两个子文件夹,然后是一个xml目录,然后是xml文件.我只知道rootFolder和xml目录的名称.
下面的代码遍历所有目录,速度极慢.有关如何优化搜索的任何建议,尤其是目录结构是否已知?
string[] files = Directory.GetFiles(@"\\somenetworkpath\rootFolder", "*.xml", SearchOption.AllDirectories);
Run Code Online (Sandbox Code Playgroud)
Mit*_*ers 16
你可以使用GetDirectories,首先得到"第一个子文件夹"的列表,循环遍历这些目录,然后重复子文件夹的循环,循环遍历它们,最后看看,而不是使用GetFiles并进行强力搜索.对于xml文件夹,最后搜索.xml文件.
现在,至于性能,速度会有所不同,但首先搜索目录,然后获取文件应该有很多帮助!
更新
好的,我做了一些测试,你实际上可以比我想象的更进一步优化它.
以下代码段将搜索目录结构并在整个目录树中查找所有"xml"文件夹.
string startPath = @"C:\Testing\Testing\bin\Debug";
string[] oDirectories = Directory.GetDirectories(startPath, "xml", SearchOption.AllDirectories);
Console.WriteLine(oDirectories.Length.ToString());
foreach (string oCurrent in oDirectories)
Console.WriteLine(oCurrent);
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
如果将其放入测试控制台应用程序,您将看到它输出结果.
现在,一旦你有了这个,只需查看每个找到的目录中的.xml文件.
小智 6
我创建了一个递归方法,GetFolders使用a Parallel.ForEach来查找名为变量的所有文件夹yourKeyword
List<string> returnFolders = new List<string>();
object locker = new object();
Parallel.ForEach(subFolders, subFolder =>
{
if (subFolder.ToUpper().EndsWith(yourKeyword))
{
lock (locker)
{
returnFolders.Add(subFolder);
}
}
else
{
lock (locker)
{
returnFolders.AddRange(GetFolders(Directory.GetDirectories(subFolder)));
}
}
});
return returnFolders;
Run Code Online (Sandbox Code Playgroud)