在本文中,将探讨一个Windows资源管理器的扩展程序,它不仅提供了文件比较的功能,还允许用户计算文件的MD5、SHA1、SHA256哈希值。这种类型的工具对于验证文件完整性和进行文件内容比较非常有用。
文件比较和完整性校验工具已经存在很长时间了。即使是MS-DOS也有这样的工具(只需在DOS命令提示符下输入fc /?)。但是,使用这些工具并不十分用户友好。Windows资源管理器允许使用COM对象作为扩展,这种集成通常非常方便。
.NET框架和一些库,如Dave Kerr的工具,使得编写外壳扩展变得更加容易。还有一些不错的文本差异工具,如Christopher Erker的DeltaScope,它们缺少外壳集成,所以将这些组件组合在一起,添加了一些自己的想法,比如Levenshtein距离,并创建了这个旨在易于使用且同时提供有用功能的扩展。
Windows资源管理器集成的代码在很大程度上依赖于SharpShell项目。为了给一个关于如何向Windows资源管理器的上下文菜单添加额外项目的示例,下面是一个扩展SharpContextMenu类的代码片段:
protected override ContextMenuStrip CreateMenu()
{
// 创建菜单栏
_menu = new ContextMenuStrip();
// 创建一个包含所有子项的菜单项
_rootItem = new ToolStripMenuItem
{
Text = "Compare&&Hash",
Image = FileCompareByHash.Resource.compare22
};
// 现在添加子项
_binaryCompareItem = new ToolStripMenuItem { Text = "Binary Compare with..." };
_binaryCompareItem.Click += (sender, args) => CompareAgainst(sender as ToolStripMenuItem);
_textCompareItem = new ToolStripMenuItem { Text = "Text Compare with..." };
_textCompareItem.Click += (sender, args) => CompareAgainst(sender as ToolStripMenuItem);
// 更多代码...
}
这段代码展示了如何创建一个上下文菜单,并添加了比较和哈希计算的选项。
Levenshtein距离是一种衡量两个字符串差异的方法。在文本文件比较中,使用它来给出一个大致的文本内容相关度。它在小尺寸的文本文件上应该表现良好。以下是用来计算Levenshtein距离的代码:
static class Levenshtein
{
static ushort[,] _costMatrix = null;
public static ushort LD(string s, string t)
{
ushort n = (ushort)s.Length;
ushort m = (ushort)t.Length;
if (_costMatrix == null || _costMatrix.GetUpperBound(0) < n || _costMatrix.GetUpperBound(1) < m)
_costMatrix = new ushort[n + 1, m + 1];
// 更多代码...
}
}
这段代码定义了一个静态类Levenshtein,它包含了计算Levenshtein距离的方法。
要比较两个文本文件,只需高亮它们,右键单击选择,并从弹出菜单导航到"Compare&&Hash"->"Compare text files..."或"Compare binary files..."。
如果文件位于不同的文件夹或驱动器上,需要执行额外的步骤,如下所示。
当要比较的文件位于不同的目录中时,选择第一个文件,右键单击它并选择"Text Compare with..."或"Binary Compare with..."。将出现一个文件对话框,以便选择要比较的文件。选择第二个文件并点击"Open"。根据选择,将显示一个消息框,显示文本差异或显示文件是否相同。
右键单击文件,选择哈希算法,将有机会将特定的哈希值复制到剪贴板。
如果所有要哈希的文件都位于同一文件夹中,可以选中它们,右键单击并选择哈希算法。将出现一个消息框,显示选定的文件及其相应的哈希值。
可以下载整个源代码来重建扩展项目并制作安装脚本,但与SharpShell相关的任何内容仅作为二进制文件存在(再次参见提供的链接以获取代码和更多信息)。
还有一个下载包含一个zip文件,其中包含安装/卸载脚本,以方便使用,其中仅包含二进制文件。