比较来自两个不同流的两个字符串永远不会相等,即使它们应该是

时间:2011-08-04 15:59:44

标签: c# stream webrequest

我有一个正在读取网站响应的流。然后我将该流保存到文本文件中的文本。

如果我再次运行它并比较同一站点的字符串和文件中保存的文本,它认为它们是不同的。

当我比较像WinMerge这样的差异工具中的两个字符串时,它会在明显相同的点上找到差异。

发生了什么事?它们都使用默认的UTF8编码器。

我很欣赏这可能很难遵循,所以我为你写了一个工作实例。

以下是一个例子:

        var request = WebRequest.Create("http://www.google.com");
        using (var response = request.GetResponse())
        using (var body = response.GetResponseStream())
        using (var googReader = new StreamReader(body))
        using (var googFileStream = File.Open("goog.txt", FileMode.OpenOrCreate))
        using (var fileReader = new StreamReader(googFileStream))
        {
            var googText = googReader.ReadToEnd();
            var fileText = fileReader.ReadToEnd();
            if (!string.Equals(googText, fileText))
            {
                googFileStream.Dispose();
                using (var msnWriter = new StreamWriter(File.Open("goog.txt", FileMode.Create)))
                {
                    msnWriter.Write(googText);
                }
            }
        }

这是WinMerge报告的明显“差异”。它显然是在html之间;字符集: Diff of the two strings

1 个答案:

答案 0 :(得分:4)

您的代码似乎很好。只是Google每次向它发送请求时实际返回不同的内容。除此之外,您可以尝试简化代码并使用每次都不会返回不同内容的网站:

var file = "goog.txt";
using (var client = new WebClient())
{
    var data = client.DownloadString("http://www.google.com");
    if (!File.Exists(file) || !string.Equals(File.ReadAllText(file), data))
    {
        File.WriteAllText(file, data);
    }
}