目前我有一个大约 170,000 个 jpg 文件名的 .txt 文件,我将它们全部读入一个列表(文件名)。
我想搜索一个文件夹(此文件夹有子文件夹)以检查 fileNames 中的每个文件是否存在于此文件夹中,如果存在,请将其复制到新文件夹中。
我做了一个粗略的估计,但对 fileNames 中的每个文件名的每次搜索和复制大约需要 0.5 秒。所以 170,000 秒大约是 48 小时,所以除以 2 后,我的应用需要大约 24 小时才能使用 1 个线程搜索每个文件名!显然这太长了,所以我想缩小范围并加快进程。使用多线程执行此操作的最佳方法是什么?
目前我正在考虑创建 20 个单独的线程并将我的列表(文件名)拆分为 20 个不同的列表并同时搜索文件。例如,我将有 20 个不同的线程同时执行以下操作:
foreach (string str in fileNames)
{
foreach (var file in Directory.GetFiles(folderToCheckForFileName, str, SearchOption.AllDirectories))
{
string combinedPath = Path.Combine(newTargetDirectory, Path.GetFileName(file));
if (!File.Exists(combinedPath))
{
File.Copy(file, combinedPath);
}
}
}
更新以在下面显示我的解决方案:
string[] folderToCheckForFileNames = Directory.GetFiles("C:\\Users\\Alex\\Desktop\\ok", "*.jpg", SearchOption.AllDirectories);
foreach(string str in fileNames)
{
Parallel.ForEach(folderToCheckForFileNames, currentFile =>
{
string filename = Path.GetFileName(currentFile);
if (str == filename)
{
string combinedPath = Path.Combine(targetDir, filename);
if (!File.Exists(combinedPath))
{
File.Copy(currentFile, combinedPath);
Console.WriteLine("FOUND A MATCH AND COPIED" + currentFile);
}
}
}
);
}
感谢大家的贡献!非常感激!