c# – 如何读取包含HTML的Lync对话文件?

我在c#中读取本地文件到字符串时遇到了问题.

这是我到现在想出来的:

 string file = @"C:\script_test\{5461EC8C-89E6-40D1-8525-774340083829}.html";
 using (StreamReader reader = new StreamReader(file))
 {
      string line = "";
      while ((line = reader.ReadLine()) != null)
      {
           textBox1.Text += line.ToString();
      }
 }

《c# – 如何读取包含HTML的Lync对话文件?》

这是唯一可行的解​​决方案.

我已经尝试了一些其他建议的方法来读取文件,例如:

string file = @"C:\script_test\{5461EC8C-89E6-40D1-8525-774340083829}.html";
string html = File.ReadAllText(file).ToString();
textBox1.Text += html;

《c# – 如何读取包含HTML的Lync对话文件?》

但它没有按预期工作.

以下是我正在尝试阅读的文件的前几行:

《c# – 如何读取包含HTML的Lync对话文件?》

正如你所看到的,它有一些时髦的角色,说实话,我不知道这是否是造成这种奇怪行为的原因.

但在第一种情况下,代码似乎跳过这些行,只打印“Office Communicator生成的文档……”

最佳答案 如果您可以使用API​​或SDK,或者甚至会描述您尝试阅读的格式,那么您的任务会更容易.然而,二进制格式看起来并不复杂,并且安装了
hexviewer,我得到了这个,以便从您提供的示例中获取html.

要解析非文本文件,请回退到BinaryReader,然后使用其中一个Read methods从字节流中读取正确的类型.我使用了ReadByteReadInt32.注意在方法的描述中如何解释读取了多少字节.当您尝试解密文件时,这会变得很方便.

    private string ParseHist(string file)
    {
        using (var f = File.Open(file, FileMode.Open))
        {
            using (var br = new BinaryReader(f))
            {
                // read 4 bytes as an int
                var first = br.ReadInt32();
                // read integer / zero ended byte arrays as string
                var lead = br.ReadInt32();
                // until we have 4 zero bytes
                while (lead != 0)
                {
                    var user = ParseString(br);
                    Trace.Write(lead);
                    Trace.Write(":");
                    Trace.Write(user.Length);
                    Trace.Write(":");
                    Trace.WriteLine(user);
                    lead = br.ReadInt32();
                    // weird special case
                    if (lead == 2)
                    {
                        lead = br.ReadInt32();
                    }
                }

                // at the start of the html block
                var htmllen = br.ReadInt32();
                Trace.WriteLine(htmllen);
                // parse the html
                var html = ParseString(br);
                Trace.Write(len);
                Trace.Write(":");
                Trace.Write(html.Length);
                Trace.Write(":");
                Trace.WriteLine(html);
                // other structures follow, left unparsed

                return html.ToString();
            }
        }
    }

    // a string seems to be ascii encoded and ends with a zero byte.
    private static string ParseString(BinaryReader br)
    {
        var ch = br.ReadByte();
        var sb = new StringBuilder();
        while (ch != 0)
        {
            sb.Append((char)ch);
            ch = br.ReadByte();
        }
        return sb.ToString();
    }

您可以在winform应用程序中使用简单的解析逻辑,如下所示:

    private void button1_Click(object sender, EventArgs e)
    {
        webBrowser1.DocumentText = ParseHist(@"5461EC8C-89E6-40D1-8525-774340083829-Copia.html");
    }

请记住,这不是防弹或推荐的方式,但它应该让你开始.对于不能很好地解析的文件,您需要返回到hexviewer并确定其他字节结构是新的还是与您已有的不同.这不是我打算帮助你的东西,而是留给你弄清楚的练习.

点赞