2015-07-27 2 views
4

У меня возникли проблемы с чтением локального файла в строку в C#.Как я могу прочитать файл диалога Lync, содержащий HTML?

Вот что я придумал до сих пор:

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(); 
     } 
} 

textbox with text from file

И это единственное решение, которое, кажется, работает.

Я пробовал некоторые другие предложенные методы для чтения файла, например:

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

enter image description here

Но это не работает, как ожидалось.

Вот первые несколько строк файла я пытаюсь прочитать:

enter image description here

, как вы можете видеть, что есть некоторые непонятные символы, если честно, я не знаю, если это причина этого странного поведения.

Но в первом случае код, кажется, чтобы пропустить эти строки, только печать «Документ, сгенерированные Office Communicator ...»

+0

, что двоичные данные? Вы можете читать двоичный поток и преобразовывать в строку. – Hybridzz

+3

Пожалуйста, напишите * двоичные * данные из начала файла - в основном посмотрите на это с помощью редактора шестнадцатеричных файлов. –

+0

Он выглядит как простой html-файл, на самом деле он имеет HTML-тег, а также все остальные части, такие как тело, стиль и т. Д. Когда он открывается с помощью хром, это простая веб-страница с мусором наверху. – user2340989

ответ

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; 

Convo History

Разговор отображается правильно, как стиль и кодирование.

Так что это начало для меня.

Спасибо всем за поддержку!

EDIT

Char.IsControl(char) 

скипы не являющиеся печатаемых символов :)

2

Ваша задача будет легче, если вы могли бы использовать API или SDK или даже будет иметь описание формата, который вы пытаетесь прочитать. Однако двоичный формат выглядит не таким сложным, и с установленным hexviewer я получил это далеко, чтобы получить html из приведенного вами примера.

Чтобы проанализировать нетекстовые файлы, вы возвращаетесь к BinaryReader, а затем используйте один из Read methods, чтобы прочитать правильный тип из байтового потока. Я использовал 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 и выяснить, какие другие структуры байтов являются новыми или отличными от того, что у вас уже было. Это не то, что я собираюсь вам помочь, это остается для вас упражнением, чтобы понять.

+0

Привет, я очень хочу попробовать ваш код! Я придумал решение, состоящее в пропуске первых n символов файла. Похоже, что это влияет только на компоненты textBox, отображая только символ «-». Консольный выход работает отлично ... Итак, вот что я придумал: http://pastebin.com/gaEZW8ar http://i.imgur.com/X3eFdUQ.jpg Я знаю, что это не самый лучший и безопасный но это отправная точка. – user2340989

+0

Пропуск n байтов является гарантией сбоя, поскольку следующий файл будет отличаться от имени/адреса, который, кажется, находится в начале файла. – rene

+0

Аналогичный тип данных с участниками повторяется в конце файла. Верхняя часть - это только заголовок и разметка CSS.Поэтому я могу потянуть информацию из этого файла. Чтение файла непосредственно в строку, просто не работает:/ – user2340989

Смежные вопросы