C# - 比较两个文本文件

时间:2015-10-20 18:46:35

标签: c# .net winforms file compare

背景

我正在开发一个简单的Windows服务,它监视某些目录中的文件创建事件并记录这些 - 长话短说,以确定文件是否从目录A复制到目录B.如果在X时间之后文件不在目录B中,则会引发警报。

这个问题是我只有文件才能获取信息,如果它已经进入目录B - 我假设两个同名的文件是相同的,但是那里超过60个目录A和一个目录B - 并且任何目录A中的文件可能意外地与另一个目录(按日期或顺序)相同,这不是一个安全的假设......

示例

让我们说,例如,我存储了一个日志文件" E17999_XXX_2111.txt"是在目录C:\ Test中创建的。我会存储文件的文件名,文件路径,文件创建日期,文件长度和BOM。

30秒后,我检测到文件" E17999_XXX_2111.txt"在目录C:\ FinalDestination中创建...现在我的任务是确定是否;

a)该文件与在C:\ Test中创建的文件相同,因此我可以将第一个日志更新为完整并停止担心。

b)文件不一样,我在某种程度上错过了之前的步骤 - 因此我可以忽略这个文件,因为它已经找到了到目的地目录的路。

研究

因此,为了确定在目的地中创建的文件是否与在第一个实例中创建的文件完全相同,我做了一些研究并找到了以下选项:

a)文件名比较

b)长度比较

c)创建日期比较

d)逐字节比较

e)哈希比较

问题

a)正如我上面所说,单凭Filename过于放肆。

b)同样,仅仅因为文件内容的长度是相同的,它并不一定意味着文件实际上是相同的。

c)问题在于复制的文件在技术上是一个新文件,因此创建日期会发生变化。无论文件出现在目录A和目录B之间的时间间隔,我都希望将第一个日志设置为完成。

d)除了这个方法非常慢的事实之外,如果第二个文件以某种方式改变了编码 - 例如在ANSII和ASCII之间,这会导致字节不匹配,那么就会出现问题。像ascii引用的东西

我不想假设只是因为一个ASCII'已更改为ANSII',文件现在已不同,因为它已足够接近。

e)这似乎与逐字节比较具有相同的缺点

修改

我遇到的实际问题似乎归结为目录之间编码差异的原因 - 我目前无法访问处理此部分的代码,所以我可以&#39 ;告诉我为什么会这样,但我希望实现一个解决方案,可以比较文件,无论编码如何,以确定"真实"差异(即不是由于编码而导致字节发生变化的差异)

如果@Magnus建议的初始比较由于这个原因导致匹配失败,我已经设法解决了这个问题,在编码我的文件后使用下面的SequenceEqual比较来删除任何不良数据。代码如下:

byte[] bytes1 = Encoding.Convert(Encoding.GetEncoding(1252), Encoding.ASCII, Encoding.GetEncoding(1252).GetBytes(File.ReadAllText(FilePath))); 
byte[] bytes2 = Encoding.Convert(Encoding.GetEncoding(1252), Encoding.ASCII, Encoding.GetEncoding(1252).GetBytes(File.ReadAllText(FilePath))); 

if (Encoding.ASCII.GetChars(bytes1).SequenceEqual(Encoding.ASCII.GetChars(bytes2)))
    { 
    //matched! 
    } 

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

然后,您必须比较文件中的字符串内容。 StreamReaderReadLines使用)应检测编码。

var areEquals = System.IO.File.ReadLines("c:\\file1.txt").SequenceEqual(
                System.IO.File.ReadLines("c:\\file2.txt"));

请注意,ReadLines不会将完整文件读入内存。