C# 比较C语言中的两个文件#
我想比较C#中的两个文件,看看它们是否不同。它们具有相同的文件名,不同时大小完全相同。我只是想知道是否有一种快速的方法可以做到这一点,而不必手动进入并读取文件 谢谢 我只是想知道是否有一种快速的方法可以做到这一点,而不必手动进入并读取文件 不是真的 如果文件带有散列,您可以比较散列,如果它们不同,您可以得出文件不同的结论(但是,相同的散列并不意味着文件相同,因此您仍然需要逐个字节进行比较) 但是,哈希使用文件中的所有字节,因此无论发生什么情况,您都必须在某个时刻逐字节读取文件。事实上,仅仅一个字节一个字节的比较比计算一个散列要快。这是因为散列读取所有字节就像逐字节比较一样,但散列会进行其他一些增加时间的计算。此外,逐字节比较可以在第一对不相等字节上提前终止C# 比较C语言中的两个文件#,c#,.net,file,compare,C#,.net,File,Compare,我想比较C#中的两个文件,看看它们是否不同。它们具有相同的文件名,不同时大小完全相同。我只是想知道是否有一种快速的方法可以做到这一点,而不必手动进入并读取文件 谢谢 我只是想知道是否有一种快速的方法可以做到这一点,而不必手动进入并读取文件 不是真的 如果文件带有散列,您可以比较散列,如果它们不同,您可以得出文件不同的结论(但是,相同的散列并不意味着文件相同,因此您仍然需要逐个字节进行比较) 但是,哈希使用文件中的所有字节,因此无论发生什么情况,您都必须在某个时刻逐字节读取文件。事实上,仅仅一个字
最后,您无法避免逐字节读取的需要。如果散列相等,这并不意味着文件相等。在这种情况下,您仍然需要逐字节比较。如果文件名相同,并且文件大小相同,那么,不,不检查内容就无法知道它们是否有不同的内容。如果它们不是符合要求的文件,则使用类似KDiff或WinMerge的差异工具。如果它们不同的话,它将突出显示
嗯,我不确定您是否可以在文件中写入时间戳。如果不是,您唯一的选择是比较文件的内容 一种简单的方法是逐字节比较文件,但是如果要将一个文件与其他文件进行多次比较,可以计算文件的哈希代码并进行比较 以下代码段显示了如何执行此操作:
public static string CalcHashCode(string filename)
{
FileStream stream = new FileStream(
filename,
System.IO.FileMode.Open,
System.IO.FileAccess.Read,
System.IO.FileShare.ReadWrite);
try
{
return CalcHashCode(stream);
}
finally
{
stream.Close();
}
}
public static string CalcHashCode(FileStream file)
{
MD5CryptoServiceProvider md5Provider = new MD5CryptoServiceProvider();
Byte[] hash = md5Provider.ComputeHash(file);
return Convert.ToBase64String(hash);
}
如果要将一个文件与其他文件进行多次比较,可以保存文件哈希并进行比较。对于单个比较,字节到字节的比较更好。当文件更改时,您还需要重新计算哈希值,但是如果您要进行大量比较(不止一次),我建议使用哈希方法。将每个文件流通过MD5哈希器并比较哈希值。根据您希望进行的比较程度,您可以查看 下面是一个简单的文件比较函数:
// This method accepts two strings the represent two files to
// compare. A return value of 0 indicates that the contents of the files
// are the same. A return value of any other value indicates that the
// files are not the same.
private bool FileCompare(string file1, string file2)
{
int file1byte;
int file2byte;
FileStream fs1;
FileStream fs2;
// Determine if the same file was referenced two times.
if (file1 == file2)
{
// Return true to indicate that the files are the same.
return true;
}
// Open the two files.
fs1 = new FileStream(file1, FileMode.Open, FileAccess.Read);
fs2 = new FileStream(file2, FileMode.Open, FileAccess.Read);
// Check the file sizes. If they are not the same, the files
// are not the same.
if (fs1.Length != fs2.Length)
{
// Close the file
fs1.Close();
fs2.Close();
// Return false to indicate files are different
return false;
}
// Read and compare a byte from each file until either a
// non-matching set of bytes is found or until the end of
// file1 is reached.
do
{
// Read one byte from each file.
file1byte = fs1.ReadByte();
file2byte = fs2.ReadByte();
}
while ((file1byte == file2byte) && (file1byte != -1));
// Close the files.
fs1.Close();
fs2.Close();
// Return the success of the comparison. "file1byte" is
// equal to "file2byte" at this point only if the files are
// the same.
return ((file1byte - file2byte) == 0);
}
将文件读入流,然后对流进行散列。这会给你一个可靠的比较结果
byte[] fileHash1, fileHash2;
using (SHA256Managed sha = new SHA256Managed())
{
fileHash1 = sha.ComputeHash(streamforfile1);
fileHash2 = sha.ComputeHash(streamforfile2);
}
for (int i = 0; (i < fileHash1.Length) && (i < fileHash2.Length); i++)
{
if (fileHash[i] != fileHash2[i])
{
//files are not the same
break;
}
}
字节[]fileHash1,fileHash2;
使用(SHA256Managed sha=new SHA256Managed())
{
fileHash1=sha.ComputeHash(streamforfile1);
fileHash2=sha.ComputeHash(streamforfile2);
}
对于(inti=0;(id131dd02c5e6eec4693d9a0698aff95c 2fcab58712467eab4004583eb8fb7f89 55AD340609F4B30283E4888832571415A 085125e8f7cdc99fd91dbdf280373c5b D8823E31563448F5BAE6DACD436C919C65 dd53e2b487da03fd02396306d248cda0 e99f33420f577ee8ce54b67080a80d1e C69821BCB88396F96526A70
2fcab50712467eab4004583eb8fb7f89 55AD340609F4B30283E488325F1415A 085125e8f7cdc99fd91dbd7280373c5b D8823E31563448F5BAE6DACD436C919C6 dd53e23487da03fd02396306d248cda0 e99f33420f577ee8ce54b67080280d1e C69821BCB6A88396F965FF72A70具有相同的md5哈希。它们不相等。如果文件仅更改了一个字符,则此操作将不起作用。流的长度应该是相同的,但内容不同。这是无效的!这实际上是从微软的网站上获取的。它执行相等比较、长度比较和逐字节比较。我想你可能错了。对不起,我不想显得粗鲁:-)问题是“它们有相同的文件名,不同的时候大小完全相同”。因此,这种方法容易出错。我们开发了一个版本控制系统,这种实现方式可能会在SCM数据库中造成灾难。@Daniel:很抱歉重提一篇旧文章,但是你能解释一下代码的实际问题吗?对我来说似乎没问题,它是检查文件大小,然后逐字节检查。一个字符的差异怎么能逃脱检查呢?格雷西亚斯!代码是正确的,但您必须向下滚动才能看到进行逐字节比较的位。我想丹尼尔没有向下滚动。我和杰森在一起:请在你向下投票时发表评论。这个答案虽然简短,但(目前)是这个帖子中唯一正确的答案。它不应该被否决,不!如果散列相等,您仍然必须逐字节比较。如果散列是不相等的,则逐字节执行会更快,因为它可以在第一对不相等的字节上提前终止,但散列必须贯穿整个文件!啊!如果你有两个文件可用