我有一个每晚都要运行的工作,从根目录下有超过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
所以看看上面的结构,结构总是一样的 - 一个根文件夹,然后是两个子文件夹,然后是一个xml目录,然后是xml文件.我只知道rootFolder和xml目录的名称.
下面的代码遍历所有目录,速度极慢.有关如何优化搜索的任何建议,尤其是目录结构是否已知?
string[] files = Directory.GetFiles(@"\\somenetworkpath\rootFolder", "*.xml", SearchOption.AllDirectories);
Mitchel Sell.. 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();
如果将其放入测试控制台应用程序,您将看到它输出结果.
现在,一旦你有了这个,只需查看每个找到的目录中的.xml文件.
你可以使用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();
如果将其放入测试控制台应用程序,您将看到它输出结果.
现在,一旦你有了这个,只需查看每个找到的目录中的.xml文件.
我创建了一个递归方法,GetFolders
使用a Parallel.ForEach
来查找名为变量的所有文件夹yourKeyword
ListreturnFolders = new List (); 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;