如何使用一键应用程序捆绑文件夹并在之后引用这些文件/文件夹?
似乎相当简单,但我无法弄清楚如何。
同样,我在文件夹index.html
中有文件UI
,我想用应用程序打包它,然后我想用字符串{{1}获取该文件的流而不仅仅是"/UI/index.html"
,整个网站。
答案 0 :(得分: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文件;如果没有,你可以改变它不返回字符串而不是byte [],并使用二进制流阅读器。
我也按file.EndsWith()
选择了足以满足我需求的文件;如果您的文件夹具有深层嵌套结构,则需要修改该代码以解析文件夹级别。
答案 1 :(得分: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加载,所以我删除了那部分以简化答案(它仍然需要在你达到它所在的方法之前写的。