2010-01-06 59 views
0

我有一個相當大的資源(2MB),我嵌入到我的C#應用​​程序中...我想知道將它讀入內存,然後將它寫入磁盤以便將其用於以後處理?將文件嵌入到C#.NET應用程序中,然後慢慢讀取它?

我已經嵌入到資源到我的項目作爲構建設置

代碼的任何試片會幫我啓動。

+0

「as build setting」並不意味着什麼。您是在資源標籤中看到它,還是在解決方案窗口中可見? – 2010-01-06 08:49:27

回答

3

你需要從磁盤資源到流中,因爲.NET框架可能直到你訪問它們將不會加載你的資源(我不是100%肯定,但我相當有信心)

當您將內容流入時,還需要將它們寫回到磁盤。

請記住,這將創建一個文件名爲「YourConsoleBuildName.ResourceName.Extenstion」

例如,如果你的項目目標被稱爲「ConsoleApplication1」,和你的資源名稱是「My2MBLarge.Dll」,那麼你的文件將被創建爲「ConsoleApplication1.My2MBLarge.Dll」 - 當然,您可以修改它,因爲您看到填充適合。

private static void WriteResources() 
    { 
     Assembly assembly = Assembly.GetExecutingAssembly(); 
     String[] resources = assembly.GetManifestResourceNames(); 
     foreach (String name in resources) 
     { 
      if (!File.Exists(name)) 
      { 
       using (Stream input = assembly.GetManifestResourceStream(name)) 
       { 
        using (FileStream output = new FileStream(Path.Combine(Path.GetTempPath(), name), FileMode.Create)) 
        { 
         const int size = 4096; 
         byte[] bytes = new byte[size]; 

         int numBytes; 
         while ((numBytes = input.Read(bytes, 0, size)) > 0) 
          output.Write(bytes, 0, numBytes); 
        } 
       } 
      } 
     } 
    } 
+0

工程...謝謝添加異常處理 – halivingston 2010-01-06 08:55:12

2
var assembly = Assembly.GetExecutingAssembly(); 
using (var stream = assembly.GetManifestResourceStream("namespace.resource.txt")) 
{ 
    byte[] buffer = new byte[stream.Length];  
    stream.Read(buffer, 0, buffer.Length); 
    File.WriteAllBytes("resource.txt", buffer); 
} 
2

嘗試以下操作:

Assembly Asm = Assembly.GetExecutingAssembly(); 
var stream = Asm.GetManifestResourceStream(Asm.GetName().Name + ".Resources.YourResourceFile.txt"); 
var sr = new StreamReader(stream); 
File.WriteAllText(@"c:\temp\thefile.txt", sr.ReadToEnd); 

的代碼假定您的嵌入式文件名爲YourResourceFile.txt,並且它被稱爲Resources項目中的文件夾中。當然文件夾c:\temp\必須存在並且是可寫的。

希望它有幫助。

/Klaus