以可执行文件保存数据

我有一个可移植的可执行文件,将数据保存到与可执行文件相同的文件夹中的文件。 当我关闭应用程序时,有什么办法可以将数据保存到可执行文件中吗?

这可能很奇怪,但是随身携带数据并且只有一个文件用于exe和数据会很棒。

如果这是用C#制作的,则更喜欢,但不是必需的。

您不能修改自己的EXE以包含任何接近优雅或紧凑方式的存储数据。 首先,操作系统在运行包含在其中的应用程序时获取EXE文件的锁定。 其次,EXE预先编译(至少进入MSIL),修改文件的源数据通常需要重新编译以重置各种指向代码句柄的指针,或者在非常深奥的层面上了解你正在做什么的严重知识文件。

通常接受的方法是应用程序配置文件,资源文件或您在运行时创建/读取/修改的某个自定义文件,就像您现在所做的那样。 应用程序的两个文件不应引起关注

您可以通过使用字符串资源保留空间并填充它。 你需要做一些侦探工作,找出你希望将数据转储到的可执行文件的偏移中的确切位置,但要小心,文件将“ 正在使用 ”,因此请谨慎使用。

那么你现在正在使用app.config(和Settings.settings)文件? 我相信这是将数据保存在.exe附近的最紧凑的方法。

我非常怀疑你可以改变.exe或其他任何部分的清单。

编辑:显然,毕竟可能有一些方法: http : //www.codeproject.com/KB/msil/reflexil.aspx

有一种方法可以使用多个流,但只适用于NTFS文件系统。 NTFS允许您在一个文件中定义备用“命名”流。 通常的内容位于main = unnamed流中。 它与您在右键单击文件并检查属性时可以看到的额外信息有关。
不幸的是,C#不支持多个流,但有一些开源的项目可以帮到你。

请参阅此链接以获取一个很好的包装器,以便在C#中将多个流读取和写入一个文件

备用数据流可能有效。 通过使用:: stream语法,您可以在exe和读/写数据中创建数据流。 编辑:要创建/访问备用数据流,您将使用不同的文件名。 类似于:applicAtion.exe:settings:$ data这将访问application.exe中名为“settings”的数据流。 要执行此操作,您需要在读取或写入文件时将:settings:$ data添加到文件名。 此function由ntfs提供,因此它在c#中工作,并且应该在应用程序运行时工作。

有关其他信息,请访问: http : //msdn.microsoft.com/en-us/library/aa364404(VS.85).aspx

如果你想随身携带数据并且只有一个文件用于exe和数据,则将它们压缩成一个自解压缩的.exe文件。

您可以将数据添加到可执行文件的末尾:

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