如何读取包含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(); } } 

带文本的文本框

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

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

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

在此处输入图像描述

但它没有按预期工作。

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

在此处输入图像描述

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

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

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

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

  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并确定其他字节结构是新的还是与您已有的不同。 这不是我打算帮助你的东西,而是留给你弄清楚的练习。

我不知道这是否是回答这个问题的正确方法,但这是我迄今为止所做的事情:

  string file = @"C:\script_test\{1C0365BC-54C6-4D31-A1C1-586C4575F9EA}.hist"; string outText = ""; //Encoding iso = Encoding.GetEncoding("ISO-8859-1"); Encoding utf8 = Encoding.UTF8; StreamReader reader = new StreamReader(file, utf8); char[] text = reader.ReadToEnd().ToCharArray(); //skip first n chars /* for (int i = 250; i < text.Length; i++) { outText += text[i]; } */ for (int i = 0; i < text.Length; i++) { //skips non printable characters if (!Char.IsControl(text[i])) { outText += text[i]; } } string source = ""; source = WebUtility.HtmlDecode(outText); HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); htmlDoc.LoadHtml(source); string html = ""; foreach (HtmlNode node in htmlDoc.DocumentNode.SelectNodes("//body")) { html += node.InnerHtml + Environment.NewLine; } html += ""; richTextBox1.Text += html+Environment.NewLine; webBrowser1.DocumentText = html; 

Convo历史

会话正确显示,包括样式和编码。

所以这对我来说是一个开始。

谢谢大家的支持!

编辑

 Char.IsControl(char) 

跳过不可打印的字符:)