我尝试过各种选择。起初它是 File.Exists()。但它在每个元素上运行 2 秒。例如,我有 60 个元素。需要2分钟。
然后我尝试获取路径列表并通过 Directory.GetFiles() 获取公共路径下所有文件的列表。但是这个选项会报错。用户名或密码不正确。 : '\server\FileStorage 文件'
Dictionary<int, string> files; // { 1, "\\\\server\\FileStorage\\files\\folder/5.3.231/file.exe" }, { 2, "\\\\server\\FileStorage\\files\\folder/5.1.1/file.exe"}, { 3, "\\\\server\\FileStorage\\files\\folder/4.1/sub/file55.exe" }
foreach (var key in files.Keys)
{
var path = Path.Combine(_coreSettings.FileStoragePath, files[key]);
files[key] = Path.GetFullPath(path);
}
HashSet<string> extensions = new();
var values = files.Values.ToList();
values.ForEach(path => extensions.Add(Path.GetExtension(path)));
var folder = new string(values.First().Substring(0, values.Min(s => s.Length))
.TakeWhile((c, i) => values.All(s => s[i] == c)).ToArray());
var filePathsExists = new List<string>();
foreach (var extension in extensions)
{
filePathsExists.AddRange(Directory.GetFiles(folder, $"*{extension}", SearchOption.AllDirectories));
}
for (var i = 0; i < filePathsExists.Count; i++)
{
filePathsExists[i] = Path.GetFullPath(filePathsExists[i]);
}
var result = files.Where(x => filePathsExists.Contains(x.Value)).ToDictionary(x => x.Key, x => x.Value);
任何想法
不是一个完整的答案,但您的代码中至少有一个问题 - 您生成的公共文件夹被确定为不正确。在最后一个
\
:之后,您可能至少需要子字符串
var lastIndexOfAny = folder.LastIndexOfAny(new[] { '\\', '/' });
if (lastIndexOfAny >= 0)
{
folder = folder.Substring(0, lastIndexOfAny + 1);
}
注意事项
ToList
上使用Dictionary.Values
(除非你打算在这个过程中修改它——但那是另一回事)——它已经应该是一个物化的集合了。