2013-02-10 60 views
1

如何將一個文件夾與一個單擊應用程序捆綁在一起,然後引用這些文件/文件夾?使用.Net應用程序打包一個文件夾

似乎很簡單,但我只是無法弄清楚如何。

如,我有文件index.htmlUI中,我想包與應用程序的話,我想用字符串"/UI/index.html"該文件的流,但是,而不是僅僅index.html,整個網站。

+0

你能詳細說明''之後引用這些文件/文件夾'是什麼意思嗎?我也沒有看到標題中的網站在哪裏。更多關於你想要做什麼的細節肯定會有所幫助。 – Despertar 2013-02-10 09:02:51

+0

已更新。我只想將一個文件夾與可以使用這些文件的應用程序捆綁在一起。 – FabianCook 2013-02-10 09:24:27

回答

2

將文件夾添加到您的VS Project中,右鍵單擊它並選擇「嵌入爲資源」。這將使文件夾中的文件被嵌入到.NET程序集中。爲了讓你的程序文件的內容,你可以使用這樣的事情:

public class ReadResource 
{ 
    public string ReadInEmbeddedFile (string filename) { 
     // assuming this class is in the same assembly as the resource folder 
     var assembly = typeof(ReadResource).Assembly; 

     // get the list of all embedded files as string array 
     string[] res = assembly.GetManifestResourceNames(); 

     var file = res.Where (r => r.EndsWith(filename)).FirstOrDefault(); 

     var stream = assembly.GetManifestResourceStream (file); 
     string file_content = new StreamReader(stream).ReadToEnd(); 

     return file_content; 
    } 
} 

在上面的功能我想你的文件text/html的文件;如果沒有,你可以改變它不返回字符串,但字節[],並使用二進制流讀取器。 我還選擇了file.EndsWith()這些文件,這些文件足夠滿足我的需求;如果您的文件夾具有深層嵌套結構,則需要修改該代碼以解析文件夾級別。

+0

至少有兩個水平的基礎和水平像'js'或'css'或類似的文件夾。代碼幫助? – FabianCook 2013-02-10 10:14:36

+1

如果您通過http請求提供網站數據,我認爲您已經以某種方式獲得了路徑。因此,如果用戶請求/js/myscript.js或/css/site.css,將此相對路徑傳遞給上述函數,它將起作用(因爲'Yourproject/UI/css/site.css'實際上以'/ css/site.css'。最好是你用調試器看一下'res'變量。它包含您的文件夾結構,但以名稱空間中文件的位置作爲前綴。 – Dyna 2013-02-10 10:17:50

1

也許有更好的方法,但考慮到內容不是太大,您可以將二進制文件作爲base64字符串直接嵌入到您的程序中。在這種情況下,它需要是該文件夾的存檔。您還需要嵌入用於解壓縮該壓縮文件的dll(如果我理解正確,您希望只有一個.exe文件)。

下面是一個簡單的例子

// create base64 strings prior to deployment 
string unzipDll = Convert.ToBase64String(File.ReadAllBytes("Ionic.Zip.dll")); 
string archive = Convert.ToBase64String(File.ReadAllBytes("archive.zip")); 

string unzipDll = "base64string"; 
string archive = "probablyaverylongbase64string"; 

File.WriteAllBytes("Ionic.zip.dll", Convert.FromBase64String(unzipDll)); 
File.WriteAllBytes("archive.zip", Convert.FromBase64String(archive); 

Ionic.Zip.ZipFile archive = new Ionic.Zip.ZipFile(archiveFile); 
archive.ExtractAll("/destination"); 

的解鏈庫是DotNetZip。這很好,因爲你只需要一個dll。 http://dotnetzip.codeplex.com/downloads/get/258012

編輯: 想想吧,只要你將Ionic.dll寫入到.exe的工作目錄中,你就不需要使用動態dll加載,所以我刪除了那部分以簡化答案(在達到它所使用的方法之前,它仍然需要寫入)。

+0

聽起來不錯:)。明天我會嘗試這樣的事情。 – FabianCook 2013-02-10 09:47:27

+0

爲什麼要將二進制文件嵌入到base64中? – 2013-02-10 09:48:44

+0

這允許您直接將數據作爲簡單字符串存儲在程序中,然後在需要時將其轉換回原始字節。 – Despertar 2013-02-10 09:57:36

相關問題