Создать ZIP-файл без записей, касающихся диска?

Я пытаюсь создать программу, которая может создавать заархивированный пакет, содержащий файлы, на основе пользовательского ввода.

Мне не нужно, чтобы какие-либо из этих файлов записывались на жесткий диск до того, как они будут заархивированы, так как в этом нет необходимости, так как же мне создать эти файлы, не записывая их на жесткий диск, а затем заархивировать?

Я использую DotNetZip.


person Community    schedule 10.12.2012    source источник


Ответы (3)


См. документацию здесь, в частности пример под названием "Создание zip-файла с использованием содержимого получено из потока":

 using (ZipFile zip = new ZipFile())
  {
    ZipEntry e= zip.AddEntry("Content-From-Stream.bin", "basedirectory", StreamToRead);
    e.Comment = "The content for entry in the zip file was obtained from a stream";
    zip.AddFile("Readme.txt");
    zip.Save(zipFileToCreate);
  }

Если ваши файлы еще не в потоковом формате, вам необходимо преобразовать их в один. Вероятно, вы захотите использовать для этого MemoryStream. .

person Bobson    schedule 10.12.2012

Я использую SharpZipLib, но если DotNetZip может делать все против базового System.IO.Stream, тогда да, просто скармливайте ему MemoryStream для записи.

person hometoast    schedule 10.12.2012

Не следует избегать записи на жесткий диск, поскольку в этом нет необходимости. Это назад. Если не требуется, чтобы весь процесс архивирования выполнялся в памяти, избегайте этого, записывая на жесткий диск.

Жесткий диск лучше подходит для хранения больших объемов данных, чем память. Если по какой-то причине ваш zip-файл окажется размером около гигабайта, ваше приложение может сдохнуть или, по крайней мере, вызвать замедление работы системы. Если вы записываете напрямую на жесткий диск, zip может иметь размер в несколько гигабайт, не вызывая проблем.

person Spencer Ruport    schedule 10.12.2012
comment
Если данные уже находятся в памяти, то нет смысла записывать их на жесткий диск только для того, чтобы прочитать их снова, чтобы вы могли их заархивировать. Таким образом, ваше утверждение Запись на жесткий диск не следует избегать, потому что это не нужно. это неверно. - person Trisped; 10.12.2012
comment
ZIP-файл никогда не будет превышать 1 мегабайт и может содержать более 200 файлов (относительно небольших), поэтому записывать их все на жесткий диск, а затем заархивировать будет неэффективно. - person ; 10.12.2012
comment
@Trisped - Конечно есть. Таким образом, вы не используете большой объем памяти. Есть причина, по которой фрагментация является таким распространенным шаблоном при работе с файлами, точно так же, как есть причина, по которой куски обычно составляют всего около 8 КБ. - person Spencer Ruport; 10.12.2012
comment
@Ipquarx - это не неэффективно. Ваше решение хранить все это в памяти, скорее всего, сработает, но ваше нежелание использовать жесткий диск — это заблуждение, которое вам следует пересмотреть. - person Spencer Ruport; 10.12.2012
comment
@SpencerRuport - я в этом не уверен. Избегание жесткого диска, который обычно является самой медленной частью системы, кажется мне хорошей идеей. Всегда при условии, что у вас достаточно знаний о вашей проблемной области, чтобы вы могли быть достаточно уверены, что внезапно не получите файл размером в несколько ГБ, который забивает вашу систему, и вам не нужна промежуточная резервная копия, если остальная часть обработки терпит неудачу. - person Bobson; 12.12.2012
comment
@Bobson - В определенных сценариях я бы не рекомендовал использовать жесткий диск, но мне кажется, что в большинстве случаев задержка записи будет довольно незначительной. Вы не только должны знать, что сами файлы не вырастут до приемлемого размера, но и что этот код не будет подвержен DoS-атаке, когда запросы на запуск этого кода передаются в систему. Тем не менее, я не ожидаю, что все согласятся, что это правильный путь, я просто почувствовал, что стоит предложить противоположное мнение по этому вопросу. - person Spencer Ruport; 12.12.2012
comment
@SpencerRuport - всегда стоит упомянуть противоположные точки зрения. Я не согласен (во всяком случае, для определенных сценариев), но именно поэтому это контрастирует. +1. - person Bobson; 12.12.2012