2013-11-15 21 views
1

我有這個文件,它使用UTF-8編碼,我試圖讀取它。到目前爲止,我已經使用BinaryReader,FileStream,我試過File.ReadAllLines。到目前爲止,我只得到文件的第一行。讀取C#中的UTF-8文件

這裏是我到目前爲止已經試過一些樣品:

public partial class Form1 : Form 
    { 
     private string filename = @"C:\UNICORN\Server\Fil\Users30.mpm"; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private static void clearText(RichTextBox rtb) 
     { 
      rtb.Text = ""; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      // use a binary reader 
      clearText(richTextBox1); 
      StringBuilder sb = new StringBuilder(); 

      using(BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open))) 
      { 
       int pos = 0; 
       int length = (int) br.BaseStream.Length; // length of the file 
       byte[] bytes = new byte[length]; 

       for(int i = 0; i < length; i++) 
       { 
        bytes[i] = br.ReadByte(); 
       } 
       sb.Append("File Size: " + bytes.Length + "\n"); 
       sb.AppendLine(System.Text.ASCIIEncoding.ASCII.GetString(bytes)); 
      } 

      richTextBox1.Text = sb.ToString(); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      // use a binary reader 
      clearText(richTextBox1); 
      StringBuilder sb = new StringBuilder(); 

      using(BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open))) 
      { 
       int pos = 0; 
       int length = (int) br.BaseStream.Length; 

       sb.Append("File Size: " + length + "\n"); 
       while (pos < length) 
       { 
        var v = br.ReadInt32(); 
        sb.Append((char)v + "\n"); 
        pos += sizeof (int); 
       } 

       richTextBox1.Text = sb.ToString(); 
      } 
     } 

     private void button3_Click(object sender, EventArgs e) 
     { 
      // use a binary reader 
      clearText(richTextBox1); 
      StringBuilder sb = new StringBuilder(); 

      using (BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open))) 
      { 
       int pos = 0; 
       int length = (int)br.BaseStream.Length; // length of the file 
       byte[] bytes = new byte[length]; 

       sb.Append("File Size: " + bytes.Length + "\n"); 
       for (int i = 0; i < length; i++) 
       { 
        var b = br.ReadByte(); 
        sb.Append("Byte: " + b + " - " + (char) b + "\n"); 
       } 

       //sb.AppendLine(System.Text.ASCIIEncoding.ASCII.GetString(bytes)); 
      } 

      richTextBox1.Text = sb.ToString(); 
     } 

     private void button4_Click(object sender, EventArgs e) 
     { 
      // use a stream reader 
      clearText(richTextBox1); 
      StringBuilder sb = new StringBuilder(); 

      using(StreamReader sr = new StreamReader(filename, Encoding.UTF8)) 
      { 
       sb.Append(sr.ReadLine() + "\n"); 
      } 

      richTextBox1.Text = sb.ToString(); 
     } 

     private void button5_Click(object sender, EventArgs e) 
     { 
      // use a stream reader 
      clearText(richTextBox1); 
      StringBuilder sb = new StringBuilder(); 

      using (StreamReader reader = new StreamReader(File.OpenRead(filename))) 
      { 
       while(!reader.EndOfStream) 
       { 
        var line = reader.ReadLine(); 
        if(line != null) 
        { 
         sb.AppendLine(line); 
        } 
       } 
      } 

      richTextBox1.Text = sb.ToString(); 
     } 

     private void button6_Click(object sender, EventArgs e) 
     { 
      // use a file stream and a decoder 
      clearText(richTextBox1); 
      StringBuilder sb = new StringBuilder(); 
      byte[] byData = new byte[255]; 
      char[] charData = new char[255]; 
      try 
      { 
       FileStream aFile = new FileStream(filename, FileMode.Open); 
       aFile.Seek(55, SeekOrigin.Begin); 
       aFile.Read(byData, 0, 100); 
      } catch (Exception ex) 
      { 
       sb.Append("ERROR: " + ex.ToString()); 
      } 

      Decoder d = Encoding.UTF8.GetDecoder(); 
      d.GetChars(byData, 0, byData.Length, charData, 0); 

      foreach(char c in charData) 
      { 
       sb.Append(c + " "); 
      } 

      richTextBox1.Text = sb.ToString(); 
     } 

     private void button7_Click(object sender, EventArgs e) 
     { 
      // find the encoding of a file, just trying to find out the encoding with this 
      clearText(richTextBox1); 
      StringBuilder sb = new StringBuilder(); 

      using(var r = new StreamReader(filename, detectEncodingFromByteOrderMarks: true)) 
      { 
       var es = r.CurrentEncoding; 
       sb.Append("Encoding: " + es); 
      } 

      richTextBox1.Text = sb.ToString(); 
     } 

     private void button8_Click(object sender, EventArgs e) 
     { 
      // use File.ReadAllLines() 
      clearText(richTextBox1); 
      StringBuilder sb = new StringBuilder(); 

      foreach(var line in File.ReadAllLines(filename, Encoding.UTF8)) 
      { 
       sb.Append(line.ToString() + "\n"); 
      } 

      richTextBox1.Text = sb.ToString(); 
     } 
    } 

這些例子都只是告訴我該文件的一行。你將如何閱讀/解析整個文件?

該文件包含一個用戶列表,我最終試圖閱讀文件來查找這些用戶名。現在,它只顯示文件的第一行是「UNICORN 3.06」。

+1

如果是UTF-8編碼,它是一個文本文件,而不是二進制文件。另外,如果它是UTF-8,爲什麼你使用'System.Text.ASCIIEncoding.ASCII.GetString('而不是'System.Text.ASCIIEncoding.UTF8.GetString('? –

+0

當我不知道它是UTF-8並沒有費心去修改它,但由於某種原因,我遇到了這個問題,我把那行代碼改成了UTF8,它仍然只讀取文件的第一行 – user

+3

如果這是一個文本文件,而不是一個真正的二進制文件,你想只是文件的文本全部作爲字符串我會使用['File.ReadAllText'](http://msdn.microsoft.com/en-us/library/ms143368 %28v = vs.110%29.aspx) –

回答

1

我相信ReadByte應該在其構造 一個LEN位置,但:

byte[] fileBytes = File.ReadAllBytes(inputFilename); 
StringBuilder sb = new StringBuilder(); 

foreach(byte b in fileBytes) 
{ 
    sb.Append(Convert.ToString(b, 2).PadLeft(8, '0')); // adds 8 '0's to left of the string 
} 

File.WriteAllText(outputFilename, sb.ToString()); 
+0

謝謝。在文件中找到一個用戶名或其他信息? – user

+1

用戶名?您只想查看ASCI文本中的文件。用戶甚至以這種方式存儲。否則,您需要知道用戶名以什麼字節開頭,以及它們是如何編碼的。現在你將進入逆向工程。這是我熟悉的其他動物> =] – MichaelEvanchik

+1

我確實做了一些計算,發現了第一行的第一個字符到用戶名的第一個字符之間的距離。我還發現文件中每個用戶名的第一個字符之間有相等的距離。 – user

2

如果你只是想在文本中,ReadAllText方法讀取整個文件爲UTF-8:

private void button1_Click(object sender, EventArgs e) 
    { 
     richTextBox1.Text = File.ReadAllText(filename); 
    } 

如果您還想要關於文件長度的信息,請將文件作爲字節讀取並將其解碼爲utf-8:

private void button1_Click(object sender, EventArgs e) 
    { 
     byte[] data = File.ReadAllBytes(filename); 
     richTextBox1.Text = "File size: " + data.Length + "\r\n" + Encoding.UTF8.GetString(data); 
    } 
+0

謝謝,這是行不通的,但是當我嘗試使用File.ReadAllText()時,它只顯示文件的第一行。也許我的文件有問題。文件大小正確,但文本太短。它應該是1,144kb,但是在富文本框中只顯示少量文本。 – user

+0

@user:那很有可能是文件有問題。你確定它是一個文本文件嗎?無論如何,您可以將'.bin'添加到文件名並在Visual Studio中打開文件,然後您就可以看到它的內容。 – Guffa

+0

謝謝,我不知道。我會嘗試在Visual Studio中打開它。我很確定這是一個文本文件。但它確實有一些怪異的字符。問題在於它對某些公司是專有的,他們不會告訴我他們是如何解析它的。 – user