我需要一些帮助.现在我已经完成了一个文件搜索,它将搜索我的整个硬盘驱动器并且可以正常工作.以下是执行此操作的两种方法.
public void SearchFileRecursiveNonMultithreaded()
{
//Search files multiple drive
string[] drives = Environment.GetLogicalDrives();
foreach (string drive in drives)
{
if (GetDriveType(drive).ToString().CompareTo("DRIVE_FIXED") == 0)
{
DriveInfo driveInfo = new DriveInfo(drive);
if (driveInfo.IsReady)
{
System.IO.DirectoryInfo rootDirectory = driveInfo.RootDirectory;
RecursiveFileSearch(rootDirectory);
}
}
}
MessageBox.Show(files.Count.ToString());
}
public void RecursiveFileSearch(DirectoryInfo root)
{
DirectoryInfo[] subDirectory;
try
{
//private List<FileInfo> files = new List<FileInfo>() is declared above
files.AddRange(root.GetFiles(searchString.Text, SearchOption.TopDirectoryOnly));
}
catch (Exception)
{
}
try
{
// Now find all the subdirectories under this directory.
subDirectory = root.GetDirectories();
foreach (System.IO.DirectoryInfo dirInfo in subDirectory)
{
// Resursive call will be performed for each subdirectory.
RecursiveFileSearch(dirInfo);
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试实现并行搜索以加快搜索速度.我尝试了几个程序来实现这一点.试图使用backgroundworker以及线程,但有问题,调试很难知道什么是错的?有人能让我知道实现并行搜索的方法.这个步骤我会自己去弄清楚.任何提供的帮助都将大大减少.
首先,正如其他人所指出的那样,当您只搜索一个驱动器时,使用多个线程不太可能加快速度.您的绝大部分时间都花在等待磁盘头移动到需要的位置,并且它一次只能在一个地方.在这里使用多个线程是浪费精力,并且很可能实际上使程序变慢.
其次,只需调用Directory.EnumerateFiles即可简化代码.如果要同时搜索多个驱动器,只需启动多个BackgroundWorker
实例,每个实例EnumerateFiles
用于搜索不同的驱动器.
但是,请注意,EnumerateFiles
如果它跨目录权限问题运行会抛出异常(代码也会如此),这在搜索整个驱动器时并不常见.如果这是一个问题(可能会是),那么你必须编写自己的目录搜索器.其中一个就是这个问题的答案.