gpt4 book ai didi

C# - 比较两个文本文件

转载 作者:太空狗 更新时间:2023-10-30 01:33:37 24 4
gpt4 key购买 nike

背景

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

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

示例

比方说,我存储了一个日志,文件“E17999_XXX_2111.txt”是在目录 C:\Test 中创建的。我会存储该文件的文件名、文件路径、文件创建日期、文件长度和 BOM。

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

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

b) 文件不一样,我不知何故错过了前面的步骤 - 因此我可以忽略这个文件,因为它已经找到了到达目标目录的路径。

研究

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

a) 文件名比较

b) 长度比较

c) 创建日期比较

d) 逐字节比较

e) 哈希比较

问题

a) 就像我上面说的,单凭文件名太冒昧了。

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

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

d) 除了这种方法非常慢之外,如果第二个文件以某种方式更改了编码,则似乎存在问题 - 例如在 ANSII 和 ASCII 之间,这会导致字节不匹配,例如 ascii 引号

我不想假设仅仅因为 ASCII“已更改为 ANSII”,文件现在就不同了,因为它非常接近相同。

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

编辑

看来我遇到的实际问题归结为目录之间编码差异的原因 - 我目前无法访问处理这部分的代码,所以我不知道为什么会发生这种情况,但我希望实现一种解决方案,该解决方案可以比较文件而不考虑编码以确定“真正的”差异(即不是那些字节因编码而改变的差异)

解决方案

如果@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!
}

感谢您的帮助!

最佳答案

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

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

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

关于C# - 比较两个文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33244490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com