使用.Net应用程序捆绑文件夹

时间:2013-02-10 08:56:07

标签: c# asp.net winforms

如何使用一键应用程序捆绑文件夹并在之后引用这些文件/文件夹?

似乎相当简单,但我无法弄清楚如何。

同样,我在文件夹index.html中有文件UI,我想用应用程序打包它,然后我想用字符串{{1}获取该文件的流而不仅仅是"/UI/index.html",整个网站。

2 个答案:

答案 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加载,所以我删除了那部分以简化答案(它仍然需要在你达到它所在的方法之前写的。