можно ли получить размер zip-файла во время его создания? Создать запись из файла

Я хотел бы знать, можно ли проверить размер zip-файла, который создается динамически, потому что я читаю каталог и генерирую zip-файл размером 19 МБ, и вместо этого я хотел бы создать два zip-файла, один 10 МБ и остальные 9мб. Однако, когда я указываю .Length в zip-файле внутри моего цикла, он говорит, что размер равен 0. Когда я заканчиваю добавлять файлы, он говорит, что это 19 МБ. Кто-нибудь знает, как это сделать?

Для этой задачи я использую только System.IO.Compression.

вот несколько примеров, чтобы показать, как я пытаюсь

    String FilePath = "D:\Invoices";
    string[] oFiles = Directory.GetFiles(FilePath,"*.pdf");
    string name = DateTime.Now.Ticks.ToString()+".zip";
    using(FileStream archive1 = File.Open(name,FileMode.Create))
    {
       using(var arch = new ZipArchive(archive1,ZipArchiveMode.Update))
           {
            for(int i =0; i<oFiles.Length;i++)
               {
                var fileinf = new FileInfo(oFiles[i]);
                arch.CreateEntryFromFile(fileinf.FullName,fileinf.Name);
                //here the zip file is always 0 
                Console.WriteLine(archive1.Length);
                }
    
           }
    }
//here the zip file is updated 

person Airton Pereira    schedule 26.09.2020    source источник
comment
CreateEntryFromFile возвращает запись. Вы можете сохранить текущую сумму сжатых размеров тех, которые вы добавляете.   -  person Retired Ninja    schedule 26.09.2020
comment
Да, я думаю об этом. Однако размер файла после архивирования становится меньше, верно?   -  person Airton Pereira    schedule 26.09.2020
comment
Я сомневаюсь, что размер конечного файла как-то меньше, чем сумма сжатых размеров каждой записи. Я ожидаю, что он будет немного больше, чтобы можно было вести бухгалтерию и тому подобное.   -  person Retired Ninja    schedule 26.09.2020
comment
Общий размер моей папки «Счета» составляет 18 МБ, а когда она заархивирована, общий размер составляет около 16 МБ. Мне интересно, могу ли я использовать счетчик для суммирования всех нормальных размеров, чтобы делать то, что мне нужно.   -  person Airton Pereira    schedule 26.09.2020


Ответы (1)


Из документации< /а>:

Когда вы устанавливаете режим «Обновить»… Содержимое всего архива хранится в памяти, и никакие данные не записываются в базовый файл или поток до тех пор, пока архив не будет удален.

Если вы хотите иметь возможность читать размер файла при добавлении элементов, вам нужно использовать ZipArchiveMode.Create.

В противном случае следует использовать ZipArchiveEntry.CompressedSize для отслеживания того, сколько вы добавили в архив.

person Peter Duniho    schedule 26.09.2020
comment
Но использовать это свойство невозможно, так как почтовый индекс уже используется. Процесс не может получить доступ к файлу «file.ext», так как он используется другим процессом. - person Airton Pereira; 26.09.2020
comment
Вы сказали, что пытаетесь создать два (или более) файла .zip из оригинала. Учитывая это, вы могли бы просто создать все новые с нуля, читая с оригинала. Если вы не хотите этого делать, просто пропустите первые N записей (где N — сколько вы хотите сохранить, исходя из суммы значений CompressedSize), а затем удалите оставшиеся из оригинала, когда вы пишете их в новый архив. В этом отношении, даже если вы создаете все новые архивы, вы можете просто использовать CompressedSize для определения общего размера, как я написал в этом ответе. - person Peter Duniho; 26.09.2020