ワンクリックアプリケーションでフォルダをバンドルし、後でそれらのファイル/フォルダを参照するにはどうすればよいですか?
かなり単純なようですが、どうすればよいかわかりません。
index.html
のように、私はフォルダにファイルを持っていてUI
、それをアプリケーションと一緒にパッケージ化したいので、そのファイルのストリームを文字列で取得したいのですが、Webサイト全体"/UI/index.html"
ではありません。index.html
フォルダを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()
また、自分のニーズに十分なファイルを選択します。フォルダが深いネスト構造を持っている場合は、フォルダレベルを解析するようにそのコードを変更する必要があります。
おそらくもっと良い方法がありますが、コンテンツが大きすぎない場合は、バイナリを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の読み込みを使用する必要はないので、答えを単純化するためにその部分を削除しました(それでも必要です)ただし、メソッドに到達する前に書き込む必要があります)。