1

ワンクリックアプリケーションでフォルダをバンドルし、後でそれらのファイル/フォルダを参照するにはどうすればよいですか?

かなり単純なようですが、どうすればよいかわかりません。

index.htmlのように、私はフォルダにファイルを持っていてUI、それをアプリケーションと一緒にパッケージ化したいので、そのファイルのストリームを文字列で取得したいのですが、Webサイト全体"/UI/index.html"ではありません。index.html

4

2 に答える 2

2

フォルダをVSプロジェクトに追加し、右クリックして[リソースとして埋め込む]を選択します。これにより、フォルダ内のファイルが.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()また、自分のニーズに十分なファイルを選択します。フォルダが深いネスト構造を持っている場合は、フォルダレベルを解析するようにそのコードを変更する必要があります。

于 2013-02-10T09:47:14.510 に答える
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は1つだけなので便利です。http://dotnetzip.codeplex.com/downloads/get/258012

編集:考えてみてください。Ionic.dllを.exeの作業ディレクトリに書き込む限り、ダイナミックdllの読み込みを使用する必要はないので、答えを単純化するためにその部分を削除しました(それでも必要です)ただし、メソッドに到達する前に書き込む必要があります)。

于 2013-02-10T09:31:24.123 に答える