0

互換性チェックを行うプログラムを作成しています...基本的に、ファイル名と特定のファイルのバージョン情報を含むデータベースを作成します。

このデータベースには何百もの一意のファイル名が保存され、これらのファイルはクライアント コンピュータのさまざまな場所に存在する可能性があります。

おそらく追加の作業を行って、各ファイルが「想定」されている場所を見つけることができますが、明らかにそれはマシンに依存することがあります。 (x86)。

ただし、これらのファイルの複数のバージョンがコンピューター上の異なる場所に存在し、appdata などの一時データ ディレクトリに格納される可能性もあります。

したがって、実際にやりたいことは、ルート ドライブ全体を検索して、これらのファイルのすべてのインスタンスを検索し、ファイルのバージョンを確認して、それをデータベースの内容と比較することです。

ルート ディレクトリ全体と 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 に答える