如何提高网络资源检查文件是否存在的速度&

问题描述 投票:0回答:1

我尝试过各种选择。起初它是 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);

任何想法

c# exists file-exists unc
1个回答
0
投票

不是一个完整的答案,但您的代码中至少有一个问题 - 您生成的公共文件夹被确定为不正确。在最后一个

\

之后,您可能至少需要子字符串
var lastIndexOfAny = folder.LastIndexOfAny(new[] { '\\', '/' });
if (lastIndexOfAny >= 0)
{
    folder = folder.Substring(0, lastIndexOfAny + 1);
}

注意事项

  • 如果您的路径太短(即您将需要枚举太多文件夹),您可能仍然希望通过文件方法进行
  • 不需要在
    ToList
    上使用
    Dictionary.Values
    (除非你打算在这个过程中修改它——但那是另一回事)——它已经应该是一个物化的集合了。
© www.soinside.com 2019 - 2024. All rights reserved.