0

我正在编写一个程序来进行兼容性检查...基本上我将拥有一个包含文件名和特定文件版本信息的数据库。

该数据库将存储数百个独特的文件名,这些文件可能存在于客户端计算机上的许多地方。

我可能会做额外的工作并找出每个文件“假设”存在的位置,但显然这有时会取决于机器,例如程序文件中可能存在 32 位系统文件,64 位可能是程序文件或程序文件(x86)。

但是,这些文件的多个版本也可能存在于计算机上的不同位置,并且可能存储在临时数据目录中,例如 appdata。

所以我真正想做的是搜索整个根驱动器,查找这些文件的所有实例,检查文件版本,并将其与数据库中的内容进行比较。

在整个根目录和所有子目录中搜索 1 个文件非常耗时,更不用说一次遍历数百个唯一文件名 1 来搜索整个根目录了。

只返回机器和位置上所有文件的列表,将其写入临时表,然后我可以在 sql 中迭代我的文件列表会更快吗?

不知道,但我希望这个搜索相当快,而不是 2 小时.... ;-)

4

1 回答 1

2

我刚刚用几个文件在我的 C 盘 (SSD) 上测试了这段代码。它在 14.79 秒内找到了 291,935 个文件。现在您只需要遍历您的文件集合并按名称匹配 - 然后检查版本。Parallel For / Foreach 循环的使用在这里证明是有用的。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var b = new BuildFileList();
            var sw = new Stopwatch();
            sw.Start();
            var files = b.GetFiles();
            sw.Stop();
            Console.WriteLine("Found {0} files in {1} seconds", files.Count, sw.Elapsed.TotalSeconds);
            Console.ReadLine();
        }
    }

    public class BuildFileList
    {
        public List<FileInfo> GetFiles()
        {
            var di = new DirectoryInfo(@"C:\");
            var directories = di.GetDirectories();
            var files = new List<FileInfo>();
            foreach (var directoryInfo in directories)
            {
                try
                {
                    GetFilesFromDirectory(directoryInfo.FullName, files);
                }
                catch (Exception)
                {
                }
            }
            return files;
        }


        private void GetFilesFromDirectory(string directory, List<FileInfo> files)
        {
            var di = new DirectoryInfo(directory);
            var fs = di.GetFiles("*.*", SearchOption.TopDirectoryOnly);
            files.AddRange(fs);
            var directories = di.GetDirectories();
            foreach (var directoryInfo in directories)
            {
                try
                {
                    GetFilesFromDirectory(directoryInfo.FullName, files);
                }
                catch (Exception)
                {
                }
            }
        }

    }
}
于 2013-07-25T01:45:10.390 回答