我无法在c#中将本地文件读成字符串。
这是我到现在想出的:
git.reset().setMode( ResetType.MIXED ).call();
这是唯一可行的解决方案。
我尝试了一些其他建议的方法来读取文件,例如:
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();
}
}
但它没有按预期工作。
以下是我正在尝试阅读的文件的前几行:
正如你所看到的,它有一些时髦的角色,说实话,我不知道这是否是造成这种奇怪行为的原因。
但在第一种情况下,代码似乎跳过这些行,只打印“Office Communicator生成的文档......”
答案 0 :(得分:2)
如果您可以使用API或SDK,或者甚至会对您尝试阅读的格式进行描述,那么您的任务会更容易。然而,二进制格式看起来并不复杂,并且安装了hexviewer我得到了这么远,以便从您提供的示例中获取html。
要解析您回退到BinaryReader的非文本文件,然后使用其中一个Read methods从字节流中读取正确的类型。我使用了ReadByte和ReadInt32。请注意如何解释方法的描述中读取了多少字节。当您尝试解密文件时,这会变得很方便。
chomp
您可以在winform应用程序中使用简单的解析逻辑,如下所示:
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();
}
请记住,这不是防弹或推荐方式,但应该让您入门。对于不能很好地解析的文件,您需要返回到hexviewer并确定其他字节结构是新的还是与您已有的不同。这不是我打算帮助你的东西,而是留给你弄清楚的练习。
答案 1 :(得分:0)
我不知道这是否是回答这个问题的正确方法,但这是我迄今为止所做的事情:
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 = "<html><style>";
foreach (HtmlNode node in htmlDoc.DocumentNode.SelectNodes("//style"))
{
html += node.InnerHtml+ Environment.NewLine;
}
html += "</style><body>";
foreach (HtmlNode node in htmlDoc.DocumentNode.SelectNodes("//body"))
{
html += node.InnerHtml + Environment.NewLine;
}
html += "</body></html>";
richTextBox1.Text += html+Environment.NewLine;
webBrowser1.DocumentText = html;
会话正确显示,包括样式和编码。
所以这对我来说是一个开始。
谢谢大家的支持!
修改强>
Char.IsControl(char)
跳过不可打印的字符:)