【发布时间】:2011-04-09 08:35:39
【问题描述】:
我有一个可移植的可执行文件,它将数据保存到与可执行文件位于同一文件夹中的文件中。当我关闭应用程序时,有什么方法可以将数据保存到可执行文件本身中?
这可能很奇怪,但是随身携带数据并且只有一个用于 exe 和数据的文件会很棒。
如果这是用 C# 制作的,我会更喜欢,但这不是必需的。
【问题讨论】:
我有一个可移植的可执行文件,它将数据保存到与可执行文件位于同一文件夹中的文件中。当我关闭应用程序时,有什么方法可以将数据保存到可执行文件本身中?
这可能很奇怪,但是随身携带数据并且只有一个用于 exe 和数据的文件会很棒。
如果这是用 C# 制作的,我会更喜欢,但这不是必需的。
【问题讨论】:
所以现在您正在使用 app.config(和 Settings.settings)文件? 我相信这是将数据保存在 .exe 附近的最紧凑的方法。
我非常怀疑您是否可以更改 .exe 的清单或它的任何其他部分。
编辑:显然,毕竟可能有一些方法:http://www.codeproject.com/KB/msil/reflexil.aspx
【讨论】:
您可以通过使用字符串资源的方式保留空间并将其填充出来。您需要做一些侦探工作,以找出您希望将数据转储到的可执行文件的偏移量的确切位置,但要小心,该文件将“in use”,所以继续谨慎对待。
【讨论】:
您不能修改自己的 EXE 以以任何接近优雅或紧凑的方式包含存储的数据。首先,操作系统在其中包含的应用程序正在运行时获得对 EXE 文件的锁定。其次,一个 EXE 是预编译的(至少到 MSIL 中),文件源数据的修改通常需要重新编译以重置指向代码句柄的各种指针,或者在非常深奥的层面上对你正在做什么的严肃知识文件。
普遍接受的方法是应用程序配置文件、资源文件或您在运行时创建/读取/修改的某些自定义文件,就像您现在所做的那样。一个应用程序的两个文件不应引起关注
【讨论】:
有一种方法可以使用多个流,但仅适用于 NTFS 文件系统。
NTFS 允许您在一个文件中定义替代的“命名”流。通常的内容在 main = unnamed 流中。它与您在右键单击文件并检查属性时可以看到的额外信息有关。
不幸的是,C# 不支持多流,但有一些开源项目可以帮助您。
请参阅this link 了解一个很好的包装器,用于在 C# 中将多个流读取和写入单个文件
【讨论】:
备用数据流可能会起作用。通过使用 ::stream 语法,您可以在 exe 中创建数据流并读取/写入数据。 编辑: 要创建/访问备用数据流,您将使用不同的文件名。就像是: 应用程序.exe:设置:$数据 这将访问 application.exe 中名为“settings”的数据流。为此,您需要在读取或写入文件时将 :settings:$data 添加到文件名。此功能由 ntfs 提供,因此它可以在 c# 中工作,并且应该在应用程序运行时工作。
更多信息请访问:http://msdn.microsoft.com/en-us/library/aa364404(VS.85).aspx
【讨论】:
如果您想随身携带数据并且只有一个用于 exe 和数据的文件,请将它们 .zip 压缩成一个自解压的 .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
【讨论】: