Сравнить 2 словаря, если ключ является именем файла, а значение - хэшем содержимого файла
У меня 2 словаря, оба словаря заполняются содержимым 2 папок. Одна папка называется Ди, а другая Дум.
Dic1 = Ди;
Dic2 = Dum;
Содержимое папок, состоящее примерно из 500 файлов, было прочитано для записи имен файлов, и я получил хэш-код для каждого содержимого.
Теперь я хочу сравнить содержание словарей, чтобы сказать мне следующее;
Есть ли в Dic1 файлы, которых нет в Dic2 и наоборот.
Упорядочены ли файлы, если нет, закажите их.
Сравните значения хешей словарей.
Результаты будут отображены в 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, но не смог получить значение хеша из словаря.