Сравнить 2 словаря, если ключ является именем файла, а значение - хэшем содержимого файла

У меня 2 словаря, оба словаря заполняются содержимым 2 папок. Одна папка называется Ди, а другая Дум.

Dic1 = Ди;

Dic2 = Dum;

Содержимое папок, состоящее примерно из 500 файлов, было прочитано для записи имен файлов, и я получил хэш-код для каждого содержимого.

Теперь я хочу сравнить содержание словарей, чтобы сказать мне следующее;

  1. Есть ли в Dic1 файлы, которых нет в Dic2 и наоборот.

  2. Упорядочены ли файлы, если нет, закажите их.

  3. Сравните значения хешей словарей.

Результаты будут отображены в ListBox.

Вот что я имею до сих пор;

namespace DirCompareForm
{
public partial class Form1 : Form
{

    Dictionary<string, byte[]> PgiFile = new Dictionary<string, byte[]>();
    Dictionary<string, byte[]> Tm2File = new Dictionary<string, byte[]>();


    byte[] _PgiHash;
    byte[] _Tm2Hash;
    string _PgiQualifiedPath;
    string _Tm2QualifiedPath;
    string fileName;

    public Form1()
    {
        InitializeComponent();
    }

    private void btnBrowse1_Click(object sender, EventArgs e)
    {
        OpenFolder1();
    }

    private void OpenFolder1()
    {
        if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
        {
            string dir1Name = folderBrowserDialog1.SelectedPath;
            string PgiFileName = Path.GetFileNameWithoutExtension(folderBrowserDialog1.SelectedPath);
            DirectoryInfo dirInfo = new DirectoryInfo(dir1Name);
            foreach(FileInfo name in dirInfo.GetFiles())
            {
                string path1 = dir1Name;
                string path2 = name.Name;
                if (FileIsWanted(name.Name))
                {
                    _PgiQualifiedPath = Path.Combine(path1, path2);
                    _PgiHash = GetFileHash(_PgiQualifiedPath);
                    PgiFile.Add(name.Name, _PgiHash);
                }   
            }
        }
    }

    private void btnBrowse2_Click(object sender, EventArgs e)
    {
        OpenFolder2();
    }

    private void OpenFolder2()
    {
        if (folderBrowserDialog2.ShowDialog() == DialogResult.OK)
        {
            string dir2Name = folderBrowserDialog1.SelectedPath;
            string Tm2FileName = Path.GetFileNameWithoutExtension(folderBrowserDialog2.SelectedPath);
            DirectoryInfo dirInfo = new DirectoryInfo(dir2Name);
            foreach (FileInfo name in dirInfo.GetFiles())
            {
                string path1 = dir2Name;
                string path2 = name.Name;
                if (FileIsWanted(name.Name))
                {
                    _Tm2QualifiedPath = Path.Combine(path1, path2);
                    _Tm2Hash = GetFileHash(_Tm2QualifiedPath);
                    Tm2File.Add(name.Name, _Tm2Hash);
                }
            }
            DictionaryCount();

        }
    }

    private void DictionaryCount()
    {
        int PgiDictionaryCount = PgiFile.Count;
        listBox2.Items.Add("Dictionaries File Count: ");
        listBox2.Items.Add(string.Format("{0} {1}", "Total number of files in PGI Folder: ", PgiDictionaryCount));
        int Tm2DictionaryCount = Tm2File.Count;
        listBox2.Items.Add(string.Format("{0} {1}", "Total number of files in TM2 Folder: ", Tm2DictionaryCount));
        listBox2.Items.Add("");
    }

    private void btnCompare_Click(object sender, EventArgs e)
    {


    }

    private bool FileIsWanted(string pFile)
    {
        if (pFile.StartsWith("dbo.") && (pFile.EndsWith(".sql", StringComparison.InvariantCultureIgnoreCase)))
        {
            return true;
        }
        return false;
    }

    private readonly HashAlgorithm _hashAlgorithm = HashAlgorithm.Create();
    private byte[] GetFileHash(string fileName)
    {
        using (FileStream stream = File.OpenRead(fileName))
        {
            if (checkBox1.Checked)
            {
                string contents = File.ReadAllText(fileName);
                contents = Regex.Replace(contents, @"\s+", string.Empty);
                byte[] hashedContents = _hashAlgorithm.ComputeHash(Encoding.UTF8.GetBytes(contents));
                return _hashAlgorithm.ComputeHash(hashedContents);
            }
            else
                return _hashAlgorithm.ComputeHash(stream);
        }
    }

    private void CompareDictionaries(byte[] PgiHash, byte[] Tm2Hash)
    {

    }

    static string ByteArrayToString(byte[] MD5Hash)
    {
        int i;
        StringBuilder hashString = new StringBuilder(MD5Hash.Length);
        for (i = 0; i < MD5Hash.Length; i++)
        {
            hashString.Append(MD5Hash[i].ToString("X2"));
        }
        return hashString.ToString();
    }

    private void Show(string line)
    {
        listBox1.Items.Add(line);
    }

    private void Show2(string line)
    {
        listBox2.Items.Add(line);
    }


}
}

Может кто-нибудь посоветовать мне, как этого добиться, пожалуйста?

Я не знаю, как вызвать значения хешей словарей, чтобы сравнить их и отобразить результаты в listBox с именем файла хешей, которые не совпадают.

Я просмотрел все ссылки на словарь сравнения на SO и увидел много Linq, которые я не понимаю.

Я пытался использовать BitConverter.ToString, но не смог получить значение хеша из словаря.

0 ответов

Другие вопросы по тегам