我查看过上一篇文章,找不到回复此问题的帖子。如果可能的话,请你指点我正确的方向。
我正在使用MD5制作C#WPF文件重复查找器,我将文件名和MD5哈希存储在2D数组中,这是我认为我可以实现此目的最快的方式,但我遇到了问题有这个。
以下代码是我想要做的:
public void fileList(string filename)
{
string[,] fileLocationHash;
string[] files = Directory.GetFiles(filename, "*.*",
SearchOption.AllDirectories);
for (int i = 0; i < files.Length; i++)
{
FileStream file = new FileStream(files[i], FileMode.Open);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(file);
file.Close();
StringBuilder sb = new StringBuilder();
for (int x = 0; x < retVal.Length; x++)
{
sb.Append(retVal[x].ToString("x2"));
}
string fileHash = sb.ToString();
// 2D array to compare hash and find duplicates
fileLocationHash = new string[,]
{
{files[i], fileHash}
};
resultTextbox.Text = resultTextbox.Text
.Insert(resultTextbox.CaretIndex, fileHash + Environment.NewLine);
resultTextbox.Text = resultTextbox.Text
.Insert(resultTextbox.CaretIndex, files[i] + " - ");
}
}
我在实现for循环时遇到问题,无法通过2D数组的fileHash部分并查找重复项。我看不出能够弄清楚如何选择数组的第二部分,因为我认为以下内容可行:
var duplicates = fileLocationHash[]
.GroupBy(g => g).Where(w => w.Count() > 1).Select(s => s.Key);
foreach (var d in duplicates);
但是这显示了fileLocationHash[]
的错误,我似乎无法理解我将如何保留和找到找到的文件的索引,我需要将其打印出来以便从中打印出文件的名称二维数组的另一部分。
答案 0 :(得分:0)
所以看起来你试图将MD5哈希的映射到具有该哈希的文件列表。在数据结构中直接表达可能更好:
var hashToFiles = new Dictionary<string, List<string>>();
现在处理新文件时,您有hash
+ fileName
- 所以您可以检查它是否已经在地图中并添加新的/更新现有条目:
if (hashToFiles.ContainsKey(hash))
{
// add new entry
hashToFiles.Add(hash, new List<string>{fileName});
}
else
{
hashToFiles[hash].Add(fileName);
}
因此,对于地图构建,唯一剩下的就是找到具有多个元素的项目
var keyValueForDups = hashToFiles.Where(item => item.Value.Length > 1);
注意:
{hash, fileName}
对以使代码可读