实现自解压档案?

时间:2012-08-26 18:24:35

标签: self-extracting

我知道我可以使用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的末尾添加数据并不是很糟糕?

1 个答案:

答案 0 :(得分:1)

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

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

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

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