実行可能ファイルと同じフォルダー内のファイルにデータを保存するポータブル実行可能ファイルがあります。アプリを閉じたときに実行可能ファイル自体にデータを保存する方法はありますか?
これは奇妙かもしれませんが、私と一緒にデータを取得し、exeファイルとデータ用のファイルが1つしかないのは素晴らしいことです。
これがC#で作成されている場合は望ましいですが、必須ではありません。
実行可能ファイルと同じフォルダー内のファイルにデータを保存するポータブル実行可能ファイルがあります。アプリを閉じたときに実行可能ファイル自体にデータを保存する方法はありますか?
これは奇妙かもしれませんが、私と一緒にデータを取得し、exeファイルとデータ用のファイルが1つしかないのは素晴らしいことです。
これがC#で作成されている場合は望ましいですが、必須ではありません。
独自のEXEを変更して、保存されたデータをエレガントまたはコンパクトな方法で含めることはできません。まず、OSは、含まれているアプリケーションの実行中にEXEファイルのロックを取得します。次に、EXEは(少なくともMSILに)プリコンパイルされており、ファイルのソースデータを変更するには、通常、コードハンドルへのさまざまなポインタをリセットするための再コンパイルが必要です。ファイル。
一般的に受け入れられている方法は、アプリケーション構成ファイル、リソースファイル、または現在行っているように実行時に作成/読み取り/変更するカスタムファイルです。アプリケーションの2つのファイルは心配する必要はありません
文字列リソースを使用してスペースを予約し、それを埋めることで、スペースを確保できます。データをダンプしたい実行可能ファイルへのオフセットのどこを正確に見つけるために少しの探偵作業を行う必要がありますが、ファイルは「使用中」になるので注意してください。慎重に進めてください。
では、現在、app.config(およびSettings.settings)ファイルを使用していますか?これは、.exeの近くにデータを保存するための最もコンパクトな方法だと思います。
.exeまたはそのその他の部分のマニフェストを変更できるかどうかは非常に疑わしいです。
編集:どうやら、結局のところいくつかの方法があるかもしれません:http: //www.codeproject.com/KB/msil/reflexil.aspx
複数のストリームを使用する方法は1つありますが、NTFSファイルシステムでのみ機能します。NTFSを使用すると、1つのファイルに代替の「名前付き」ストリームを定義できます。通常のコンテンツは、メイン=名前のないストリームにあります。これは、ファイルを右クリックしてプロパティを確認したときに表示される追加情報と関係があります。
残念ながら、C#は複数のストリームをサポートしていませんが、役立つオープンソースのオブジェクトがあります。
C#で複数のストリームを1つのファイルに読み書きするための優れたラッパーについては、このリンクを参照してください
代替データストリームが機能する可能性があります。:: stream構文を使用すると、exe内にデータストリームを作成し、データの読み取り/書き込みを行うことができます。編集:代替データストリームを作成/アクセスするには、別のファイル名を使用します。次のようなもの:applicAtion.exe:settings:$ dataこれは、application.exe内の「settings」という名前のデータストリームにアクセスします。これを行うには、ファイルの読み取りまたは書き込み時にファイル名に:settings:$dataを追加する必要があります。この機能はntfsによって提供されるため、c#で機能し、アプリケーションの実行中に機能するはずです。
追加情報は、http: //msdn.microsoft.com/en-us/library/aa364404 (VS.85).aspxで入手できます。
データを持ち歩き、exeとデータ用のファイルが1つしかない場合は、それらを自己解凍型の.exeに.zip形式で圧縮します。
実行可能ファイルの最後にデータを追加できます:
var executableName = Process.GetCurrentProcess().MainModule.FileName;
// rename executable file
var newExecutableName = fullPath.Replace(".exe", "_.exe");
FileInfo fi = new FileInfo(executableName);
fi.MoveTo(newExecutableName);
// make copy of executable file to original name
File.Copy(newExecutableName, executableName);
// write data end of new file
var bytes = Encoding.ASCII.GetBytes("new data...");
using (FileStream file = File.OpenWrite(executableName))
{
file.Seek(0, SeekOrigin.End);
file.Write(bytes, 0, bytes.Length);
}
// we can delete old file when exited