2012-06-18 28 views
0

我是新來的編碼主題,並希望更詳細地瞭解它。我在MSDN上找到了創建文件夾和文件的例子。該文件的創建是通過使用WriteByte方法完成的。 http://msdn.microsoft.com/en-us/library/as2f1fez.aspx文件編碼:這是否適用於C#的WriteByte方法?

爲方便起見,我直接放在下面的代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace CreateFolderFile 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Specify a "currently active folder" 
      string activeDir = @"c:\testdir2"; 

      //Create a new subfolder under the current active folder 
      string newPath = System.IO.Path.Combine(activeDir, "mySubDir"); 

      // Create the subfolder 
      System.IO.Directory.CreateDirectory(newPath); 

      // Create a new file name. This example generates 
      // a random string. 
      string newFileName = System.IO.Path.GetRandomFileName(); 

      // Combine the new file name with the path 
      newPath = System.IO.Path.Combine(newPath, newFileName); 

      // Create the file and write to it. 
      // DANGER: System.IO.File.Create will overwrite the file 
      // if it already exists. This can occur even with 
      // random file names. 
      if (!System.IO.File.Exists(newPath)) 
      { 
       using (System.IO.FileStream fs = System.IO.File.Create(newPath)) 
       { 
        for (byte i = 0; i < 100; i++) 
        { 
         fs.WriteByte(i); 
        } 
       } 
      } 

      // Read data back from the file to prove 
      // that the previous code worked. 
      try 
      { 

       byte[] readBuffer = System.IO.File.ReadAllBytes(newPath); 
       foreach (byte b in readBuffer) 
       { 
        Console.WriteLine(b); 
       } 
      } 
      catch (System.IO.IOException e) 
      { 
       Console.WriteLine(e.Message); 
      } 



      // Keep the console window open in debug mode. 
      System.Console.WriteLine("Press any key to exit."); 
      System.Console.ReadKey(); 
     } 
    } 
} 

我也發現了關於這個問題的一個有趣的文章由Joel Spolsky的還有:

絕對最低每一個軟件開發者絕對,積極必須知道Unicode和字符集(沒有藉口!) http://www.joelonsoftware.com/printerFriendly/articles/Unicode.html

我的問題:什麼編碼是由第e WriteByte方法?從我所做的閱讀中,無論您使用什麼,是否真的有可能準確確定文件的編碼? (例如:您發送的一個csv文件,並使用Notepad ++確定編碼)。

想法?

+0

這將使用.NET使用的默認編碼。是的,取決於編碼,你可以確定什麼是使用這是像Notepad ++這樣的程序能夠做到這一點。 –

+4

@Ramhound:不,它不會使用「默認編碼」 - 這個概念根本不適用。 'WriteByte'寫入你請求的字節 - 沒有文字可以用這種或那種方式映射。 –

回答

1

WriteByte方法根本不使用任何編碼。字節值完全按照規定寫入,無需轉換。

編碼僅用於文本。通常整個文本文件使用相同的編碼,但可能有一個包含二進制數據和編碼文本的文件。

該文件本身沒有任何有關任何編碼的信息。該文件只包含字節,編碼可用於將字節解釋爲文本。

某些文件格式在文件的開頭有一個指示符來確定編碼。通常情況下,您會使用中性編碼(例如ASCII)讀取文件的第一部分,以獲取有關使用哪種編碼的信息。 (這是一個引導問題。)

例如可以包含一個版本標記,其可以包含指定的編碼的屬性的XML文件的第一行。另一個例子是在一個Unicode文本文件中的第一個字符,其可以是可被用於確定使用了哪個Unicode編碼的類型一個BOM(字節順序標記)。

+0

在此基礎上,它聽起來就像是唯一準確的方法來確定文件的編碼將找出使用什麼方法,在第一時間寫? – Ray

+0

@ Ray:是的,沒錯。如果文件不包含任何關於編碼的信息,則唯一的來源是文件的創建者。 – Guffa

+0

優秀的答案,@Guffa。非常感謝你的細節。 – Ray

1

Stream.WriteByte涉及字節兩個輸入(參數的方法)和輸出(目標流),其本質上是二進制數據 - 這樣的編碼(文本和二進制信息之間的映射)的概念沒有按不適用。現在

,如果你要閱讀文件使用WriteByte電話就好像它是一個文本文件會要求您解釋它在一個特定的編碼創建。這是另一回事 - 文件的內容仍然只是字節。如Guffa的回答所指出的,文件沒有(典型地,無論如何,)具有任何編碼的概念。這只是一個字節桶。如果您的文件是只是純文本,您必須知道編碼在讀取時是什麼,或者通過啓發式來推斷它。


的文件系統可以保持的元數據編碼,當然 - 但它會到創建程序來設置。

+0

我明白了。謝謝@Jon! – Ray

相關問題