Реализовать самораспаковывающийся архив?

Я знаю, что могу использовать 7z или winrar, но я хочу научиться этому для себя.

Как реализовать самораспаковывающийся архив? Я могу использовать C# или C++, но позвольте мне решить проблему.

Когда я открываю exe, мне нужен какой-то графический интерфейс, спрашивающий, где извлечь файлы. Как только пользователь скажет «ОК», я, очевидно, должен их извлечь. Я уже реализовал простой пример в C # winforms, НО моя проблема в том, КАК я могу получить имена файлов и двоичные файлы файлов в exe?

Однажды я спрашиваю Безопасно ли добавить дополнительные данные в конец исполняемого файла? и в ответе было предложено, если я просто добавлю данные в конец исполняемого файла, он может быть обнаружен антивирусным сканером. Теперь довольно легко записать длину архива как последние 4 байта и просто добавить данные в мой общий exe, и я верю, что мой процесс может прочитать мой собственный exe, чтобы это могло работать. Но это кажется хакерским, и я не хочу, чтобы люди обвиняли меня в написании вируса только потому, что я использую эту технику. Каков правильный способ реализовать это?

Примечание. Я проверил самораспаковывающийся тег, и многие вопросы заключаются в том, как манипулировать самораспаковывающимся, а не в том, как реализовать. За исключением этого, который запрашивает что-то еще самораспаковывающийся исполняемый файл с самопроверкой

-edit- Я сделал два самораспаковывающихся с 7z и сравнил их. Похоже... ну, это файл 7z.sfx, но с добавленным обычным архивом 7z. Так... в этом нет ничего плохого? Есть ли способ лучше? Я нацелен на Windows и могу использовать компилятор С#, чтобы помочь, но я не знаю, сколько дополнительной работы или насколько сложно это может быть программно, и, может быть, добавление данных в конец exe не плохо?


person Community    schedule 26.08.2012    source источник
comment
Это во многом зависит от вашей операционной системы. И самораспаковывающиеся архивы могут быть проблемами безопасности....   -  person Basile Starynkevitch    schedule 26.08.2012
comment
@BasileStarynkevitch, запускающий a exe, может быть проблемой безопасности...   -  person    schedule 26.08.2012


Ответы (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.

Я надеюсь, что это решение безопасно для сканера вирусов, так как этот метод создает полный, действительный исполняемый файл.

person Kuba Wyrostek    schedule 26.08.2012
comment
Я попробовал это. Я не мог понять, можно ли перечислить файл ресурсов. Я тестировал два файла, и мне пришлось вручную создать массив, чтобы передать его функции извлечения. На самом деле я гуглил, могу ли я создать файл csproj за несколько минут до того, как прочитал это. Можно ли перечислять файлы? также как мне программно сделать файл ресурсов? - person ; 26.08.2012
comment
Извините, но мне никогда не нужно было заходить так далеко, поэтому я не знаю. Но я считаю, что это выходит за рамки вашего первоначального вопроса. - person Kuba Wyrostek; 26.08.2012
comment
Ах... И вам не нужно иметь файл .csproj для компиляции кода C#. Оба файла .cs и .resx представляют собой обычный текст, поэтому вы можете создать их программно и скомпилировать с использованием csc (или, возможно, MSBuild). - person Kuba Wyrostek; 26.08.2012