2

我知道我可以使用 7z 或 winrar,但我想自己学习。

我将如何实现自解压存档?我可以使用 C# 或 C++,但让我解决问题。

当我打开 exe 时,我需要某种 GUI 来询问在哪里提取文件。一旦用户说好的,我显然应该提取它们。我已经在 C# winforms 中实现了一个简单的示例,但我的问题是如何将文件的文件名和二进制文件放入 exe 中?

曾几何时,我问将额外数据添加到 exe 末尾是否安全?答案建议如果我只是将数据添加到 exe 的末尾,它可能会被病毒扫描程序拾取。现在很容易将存档的长度写为最后 4 个字节,只需将数据附加到我的通用 exe 中,我相信我的进程可以读取我自己的 exe,所以这可以工作。但这感觉很hacky,我宁愿不要因为我使用这种技术而让人们指责我编写病毒。实现这一点的正确方法是什么?

注意:我检查了自解压标签,很多问题是如何操作自解压而不是如何实现。除了这个问别的东西自解压自检可执行文件

-edit- 我用 7z 做了两个自解压并比较了它们。它看起来像......它是7z.sfx文件,但附加了一个常规的 7z 存档。所以……这样做有什么不对吗?有没有更好的办法?我的目标是 Windows,可以使用 C# 编译器来提供帮助,但我不知道有多少额外的工作或以编程方式可能有多困难,也许将数据添加到 exe 的末尾不是坏事吗?

4

1 回答 1

1

有可能的。当我们需要为应用程序分发更新时,我曾经使用过以下技术,但是计算机已配置为最终用户无权更改应用程序文件。该更新应该登录到管理员帐户并更新所需的文件(因此我们遇到了相同的问题:如何将许多文件作为单个可执行文件分发)。

解决方案是 C# 中的文件资源。您需要做的就是:

  1. 在 C# 项目中创建一个资源文件(以 .resx 结尾的文件)。
  2. 添加“文件”类型的新资源。您可以轻松地将现有文件添加为byte[]资源。
  3. 在程序中,您可以简单地将资源提取为文件:
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 等库轻松实现。

我希望这个解决方案是病毒扫描程序安全的,因为这种方法会创建完整、有效的可执行文件。

于 2012-08-26T19:10:25.620 回答