dnt*_*012 0 .net c# filereader
我在网络上迭代一个大目录(500 GB),我需要从root和子目录中迭代所有文件,这是我的示例代码
static void WalkDirectoryTree(DirectoryInfo root, DbContext dbcontext)
{
FileInfo[] files = null;
DirectoryInfo[] subDirs = null;
try
{
Console.WriteLine(DateTime.Now + " Listing files...");
files = root.GetFiles("*.*");
Console.WriteLine(DateTime.Now + " Files obtained.");
}
catch (UnauthorizedAccessException e)
{
}
catch (System.IO.DirectoryNotFoundException e)
{
Debug.Print(e.Message);
}
if (files != null)
{
Console.WriteLine(DateTime.Now + " Iterating files...");
foreach (System.IO.FileInfo fi in files)
{
Console.WriteLine(DateTime.Now + " Indexing [" + fi.FullName + "]...");
doIndex(IndexData index = new IndexData();
index.attachementUID = fi.Name;
dbcontext.IndexDatas.Add(index);
}
Console.WriteLine(DateTime.Now + " File iteration completed.");
subDirs = root.GetDirectories();
foreach (System.IO.DirectoryInfo dirInfo in subDirs)
{
WalkDirectoryTree(dirInfo,dbcontext);
}
}
}
Run Code Online (Sandbox Code Playgroud)
性能非常慢,我正在读取文件名和文件路径,所以你们可以推荐一些东西,我可以用它来迭代网络路径中的所有文件,如何改进当前代码,任何System.IO改进和替代方案.
其次,我如何跟踪我在文件系统中的位置.迭代中途和应用程序崩溃,我怎么能从同一个位置再次开始迭代?
你应该使用DirectoryInfo.EnumerateFiles()而不是DirectoryInfo.GetFiles()从MSDN:
EnumerateFiles和GetFiles方法的不同之处如下:当您使用EnumerateFiles时,您可以在返回整个集合之前开始枚举名称集合; 当您使用GetFiles时,您必须等待返回整个名称数组,然后才能访问该数组.因此,当您使用许多文件和目录时,EnumerateFiles可以更高效.