我知道我可以使用7z或winrar,但我想为自己学习。
我如何实现自解压存档?我可以使用C#或C ++,但让我解决问题。
当我打开exe时,我需要某种GUI询问在哪里提取文件。一旦用户说好,我显然应该提取它们。我在C#winforms中实现了一个简单的例子,但我的问题是如何将文件的文件名和二进制文件转换为exe文件?
有一次,我问Is it safe to add extra data to end of exe?并且答案建议如果我只是将数据添加到exe的末尾,它可能被病毒扫描程序拾取。现在很容易将存档的长度写为最后4字节,只是将数据附加到我的通用exe,我相信我的进程可以读取我自己的exe,所以这可以工作。但它感到hacky,我宁愿没有人指责我只是因为我正在使用这种技术来编写病毒。什么是实施这个的正确方法?
注意:我检查了自解压标记,很多问题是如何操作自解压而不是如何实现。除了这个要求别的东西Self-extracting self-checking executable
-edit-我用7z进行了两次自我提取并对它们进行了比较。看起来......好吧它是7z.sfx
文件,但附加了常规的7z档案。那么......这样做有什么不对吗?有没有更好的办法?我的目标是Windows,并且可以使用C#编译器来帮助,但我不知道有多少额外的工作或者编程有多困难,并且可能在exe的末尾添加数据并不是很糟糕?
答案 0 :(得分:1)
有可能。当我们需要为应用程序分发更新时,我使用了以下技术,但配置了计算机,以便最终用户无权更改应用程序文件。该更新应该登录到管理员帐户并更新所需的文件(因此我们遇到了相同的问题:如何将许多文件作为单个可执行文件分发)。
解决方案是C#中的文件资源。您所需要做的就是:
byte[]
资源。System.IO.FileStream file = new System.IO.FileStream("C:\\PathToFile",
System.IO.FileMode.OpenOrCreate);
System.IO.BinaryWriter writer = new System.IO.BinaryWriter(file);
writer.Write(UpdateApplication.Data.DataValue, 0, UpdateApplication.Data.DataValue.Length);
(这里UpdateApplication.Data
表示二进制资源)。
我们的解决方案缺乏压缩,但我相信使用C#ZipLib等库可以轻松实现。
我希望这个解决方案是病毒扫描程序安全的,因为这个方法可以创建完整,有效的可执行文件。