Как найти размер файла после сжатия

   ПульсЪ

27.10.10 — 18:25

всем привет ) есть кусок кода:

ХранилищО = Новый ХранилищеЗначения(ВыбФайл,новый СжатиеДанных(9));

есть ВыбФайл, можно ли как нибудь узнать размер файла, после того как он сжат.. до сжатия размер легко выцепить, а после..? кто нибудь вкурсе, мб подскажите)

   le_

1 — 27.10.10 — 18:40

Примерно так же, как zip, наверное, жмет.
Deflate, как пишут, в gzip, pkzip используется.

Точно вряд ли получится вычислить.

   le_

2 — 27.10.10 — 18:48

+ (1) Если сомневаешься, в эффективности, можешь сначала 7-zip-ом, например, паковать, а потом в хранилище подсовывать.

   ПульсЪ

3 — 28.10.10 — 11:24

(2) сомневаюсь.. хотя хз.. нуна попробывать cf грузануть и попробывать думаю ккой нить большой вордовский документ и сравнить… сначала паковать потом грузить не оч подходит, т.к. хочу довести все до полного автомата..

   ПульсЪ

4 — 28.10.10 — 12:12

ап

   ПульсЪ

5 — 28.10.10 — 12:52

не ап, больше никаких вариков небудет?)

   Murzz

6 — 28.10.10 — 13:02

(3) cf не имеет к этому никакого отношения

   forforumandspam

7 — 28.10.10 — 13:08

До = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ИмяФайла), Новый СжатиеДанных(0));

После = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ИмяФайла), Новый СжатиеДанных(9));

Дальше допили формулу из Книга знаний: Как рассчитать размер данных помещенных в объект ХранилищеЗначения

   forforumandspam

8 — 28.10.10 — 13:12

+(7) не рекомендую таким способом большие объёмы проверять. ;-)

   H A D G E H O G s

9 — 28.10.10 — 13:14

Зачем?

   nop

10 — 28.10.10 — 13:16

ЗначениеВФайл() и проверить размер? (не путать размер на диске с размером файла)

   forforumandspam

11 — 28.10.10 — 13:33

(10) Не прокатит.

Глобальный контекст
ЗначениеВФайл (ValueToFile)

Описание:
Сохраняет любое сериализуемое значение в файл.

   ПульсЪ

12 — 28.10.10 — 13:37

(8) нащет больших объемов (>гб) я проблему решил)

а это ща попробую

   forforumandspam

13 — 28.10.10 — 13:40

(12) Начни с малых объёмов.

   aleks-id

14 — 28.10.10 — 13:45

РезультатПак = ЗначениеВСтрокуВнутр(Новый ХранилищеЗначения(Новый ДвоичныеДанные(«D:win.txt»), Новый СжатиеДанных(9)));
НачальнаяПозиция = Найти(РезультатПак, «base64:»)+7;
ДлинаРП = СтрДлина(РезультатПак);
Стр64 = Сред(РезультатПак, НачальнаяПозиция, ДлинаРП-НачальнаяПозиция-2);
ДлинаФайла = Окр((СтрДлина(Стр64)-2*(СтрЧислоСтрок(Стр64)-1))/4*3);
ДлинаФайла = ДлинаФайла — ?(Прав(Стр64,1) = «=»,1,0) — ?(Прав(Стр64,2) = «==»,1,0);
Сообщить(«Со сжатием: » + ДлинаФайла);

   Rabbit

15 — 28.10.10 — 13:49

что-то меня эта девятка на мысли о bzip наталкивает.

   aleks-id

16 — 28.10.10 — 13:56

Base64Значение(Стр64).Записать(«D:win.bin»);

проверьте сами что за формат :)

   forforumandspam

17 — 28.10.10 — 14:13

(14) Неправильно.

   ПульсЪ

18 — 28.10.10 — 14:13

(14) спасибо ман, вроде работает)

   forforumandspam

19 — 28.10.10 — 14:15

(18) Не слушай его. Он во первых забыл:
Хран = Новый ХранилищеЗначения(Новый ДвоичныеДанные(«D:win.txt»), Новый СжатиеДанных(9));
РезультатПак = ЗначениеВСтрокуВнутр(Хран.Получить());

   ПульсЪ

20 — 28.10.10 — 14:18

(19) да не, вродерабит, проверил сжал кодом сначала, потом 7z этот же файл, погрешность разница около 2000 байт, думаю это из за того что разбивка по разным алгоритмам..

   forforumandspam

21 — 28.10.10 — 14:22

(20) Ты попробуй коэффициент сжатия «0» поставить и получить первоначальный размер файла. Если будешь использовать код из (14), то не получишь равенства.

   ПульсЪ

22 — 28.10.10 — 14:22

(21) ща

   ПульсЪ

23 — 28.10.10 — 14:24

разница

файл объем кодом 4 506 389

сам файл         4 505 600

впринципе почти норм, видимо просто алгоритм формулы неточность выдает

   forforumandspam

24 — 28.10.10 — 14:27

(23) Нет, смотри код (19). Не забудь «Хран.Получить()»

   ПульсЪ

25 — 28.10.10 — 14:31

(24) ща поправлю, попробуем)

   forforumandspam

26 — 28.10.10 — 14:32

А ещё лишние 2 оператора. Вот эти строчки нафиг не нужны:

ДлинаРП = СтрДлина(РезультатПак);
Стр64 = Сред(РезультатПак, НачальнаяПозиция, ДлинаРП-НачальнаяПозиция-2);

если заменить
  РезультатПак = ЗначениеВСтрокуВнутр(
на
  РезультатПак = Base64Строка(

   ПульсЪ

27 — 28.10.10 — 14:58

видимо да, ща попробую, т.к. код перестал вооще рабить и стал показывать один и тот же размер))

   forforumandspam

28 — 28.10.10 — 15:03

(27) Сам проверил, Хран.Получить(), получается аналог «разархивировать». Значит его всё-таки надо убрать. И получается, что при коэффициенте «0» размер не совпадает из-за особенности типа «ХранилищеЗначения». Но (26) всё-же прими к сведению.

   ПульсЪ

29 — 28.10.10 — 15:05

(28) да да, вот я о том же и говорил, что алгоритмы сжатия видим различаются, 7z чуть получше )

   ПульсЪ

30 — 28.10.10 — 15:06

(29) хотя мб и от Хранилища… хз, но меня лично результат вполне устраивает

   aleks-id

31 — 28.10.10 — 16:26

с точностью до байта:

//Создаем хранилище и сохранаем в него данные
Хран = Новый ХранилищеЗначения(Новый ДвоичныеДанные(«D:win.txt»), Новый СжатиеДанных(9));

//Получаем строку, содержащую служебный заголовок и двоичные данные в формате base64
РезультатПак = ЗначениеВСтрокуВнутр(Хран);

//Отсекаем заголовок и выцепаем строку base64 в чистом виде
Стр64 = Сред(РезультатПак, Найти(РезультатПак, «base64:»)+7, СтрДлина(РезультатПак)-Найти(РезультатПак, «base64:»)-9);
//Стр64 = Сред(РезультатПак, НачальнаяПозиция, ДлинаРП-НачальнаяПозиция-2);

//Записываем сжатые двоичные данные в файл
Base64Значение(Стр64).Записать(«D:win.bin»);

Файл = Новый Файл(«D:win.bin»);
//Получаем размер файла
Сообщить(Файл.Размер());

   ПульсЪ

32 — 09.11.10 — 18:27

(31) работает) спасибо)

для сравнения выяснил что 1C архиватор хуже чем 7z архиватор, ворд, эксель, текстовые сжимает не очень, зато трек .mp3 сжал чуток получше чем .7z

интересный момент)

  

H A D G E H O G s

33 — 09.11.10 — 21:51

(31)

С точностью до байта без записи в файл:

Хран = Новый ХранилищеЗначения(Новый ДвоичныеДанные(«D:win.txt»), Новый СжатиеДанных(9));
//Получаем строку, содержащую служебный заголовок и двоичные данные в формате base64
РезультатПак = ЗначениеВСтрокуВнутр(Хран);

//Отсекаем заголовок и выцепаем строку base64 в чистом виде
Стр64 = Сред(РезультатПак, Найти(РезультатПак, «base64:»)+7, СтрДлина(РезультатПак)-Найти(РезультатПак, «base64:»)-9);
Сообщить(СтрДлина(Стр64)*0.75);

 
stupid
 
(2002-05-27 15:23)
[0]

Открыв файл, я вывожу его размер на форме. После нажатия на кнопку запускаеться внешняя программа, которая сжимает файл, открытый в моем приложении. Хотелось бы показать его размер после сжатия. Как это можно сделать на практике? Вот структура всего процесса:

1. Открытие файла в моем приложении

2. Отображения размера файла на форме до сжатия

3. Запуск внешней программы, которая сжимает файл, открытый в моем приложении

4. Отображение размера файла на форме после сжатия
//Не реализовано

Конечно, можно положить на форму кнопку, по нажатию на которую будет определяться размер после сжатия, но это мне не очень подходит.

Вот функция, с помощью которой я определяю размер файла, может, кому-нибудь сгодиться.

Function GetFileSize(namefile : string) : Integer;

Var

InfoFile : TSearchRec;

AttrFile : Integer;

ErrorReturn : Integer;

Begin

AttrFile := $0000003F;

ErrorReturn := FindFirst(namefile,AttrFile,InfoFile);

if ErrorReturn <> 0 Then

Result := -1

else

Result := InfoFile.Size; {Размер файла в байтах}

FindClose(InfoFile);

End;

//Вызов функции. (выводит размер файла в байтах в Label1):

Label1.Caption:=inttostr(GetFileSize("c:kuku.txt"))+ " байт";


 
Song
 
(2002-05-27 15:27)
[1]

Сжимаете чем? Архиватором? Во многих архиваторах есть ключик при ктором в файл выводится различная информация о файлах в этом архиве, в том числе и размеры файла(ов) со сжатием, до сжатия, степень сжатия и т.д.


 
Romkin
 
(2002-05-27 15:28)
[2]

FindFirstChangeNotification (FindNext) — следит за изменениями в файле/каталоге. При записи в файл другой программой возврат происходит после завершения записи. (и не забывай о FindClose…)


 
stupid
 
(2002-05-27 15:30)
[3]

2Song © (27.05.02 15:27)

Сжимаю UPX»ом.

У него такого ключика нет.


 
stupid
 
(2002-05-27 15:53)
[4]

2Romkin © (27.05.02 15:28)

Можешь объяснить на примере?


 
ION T
 
(2002-05-27 16:04)
[5]

Очередной шелл для юпикса пишешь?

Зайди в кладовку (раздел с готовыми прогами) — там возьми исходники моего и переделывай как хочешь…..и посмотри в юнит MultiFrm.pas, там есть несколько функций для анализа размера файла…


 
Romkin
 
(2002-05-27 16:25)
[6]



procedure TForm1.Button1Click(Sender: TObject);

var

ChHandle: THandle;

WaitCode: DWORD;

begin

ChHandle :=

FindFirstChangeNotification("d:", false, FILE_NOTIFY_CHANGE_SIZE);

if ChHandle = INVALID_HANDLE_VALUE then

begin

ShowMessage("Cant create notify: " + IntToHex(GetLastError,8));

Exit;

end;

Button1.Enabled := False;

try

repeat

repeat

WaitCode :=

MsgWaitForMultipleObjects(1, ChHandle, False, INFINITE, QS_ALLINPUT);

if WaitCode = (WAIT_OBJECT_0 + 1) then

Application.ProcessMessages;

until (WaitCode = WAIT_OBJECT_0) or (WaitCode = WAIT_ABANDONED_0);

if WaitCode = WAIT_OBJECT_0 then

begin

if MessageDlg("Size of some file in d: changed... Continue?",

mtConfirmation, [mbYes, mbNo], 0) = mrNo

then

raise Exception.Create("OK! Exit now...");

if not FindNextChangeNotification(ChHandle) then

raise Exception.Create("Cant create next notify: " +

IntToHex(GetLastError,8));

end;

until (WaitCode = WAIT_ABANDONED_0);

finally

FindCloseChangeNotification(ChHandle);

Button1.Enabled := True;

end;

end;



 
stupid
 
(2002-05-27 17:03)
[7]

Всем огромное спасибо!

2ION T © (27.05.02 16:04)

Отличный
UPX Shell. Просто отличный!

Грузонул исходники, буду разбираться.

Я так понял на внешний вид оболочки сказался вид ASPack»a?

2Romkin © (27.05.02 16:25)

Огромное спасибо за код, на исходниках я только и учусь.

Практика, практика и еще раз практика…


Привет. Где посмотреть, до какого размера gzip сжал размер файла? Во вкладке Network в Google Dev Tools виден исходный размер файла.

UPD: в Google Chrome есть два параметра, отображающие размер файла и количество байт, переданных по сети. Однако, у меня этот параметр не отображается, хотя сжатие включено.

введите сюда описание изображения

задан 23 июн 2017 в 16:12

JamesJGoodwin's user avatar

JamesJGoodwinJamesJGoodwin

3,9766 золотых знаков35 серебряных знаков70 бронзовых знаков

2

В Network на против каждого запроса есть 2 цифры:

  1. Количество байт переданных по сети
  2. Размер содержимого

Вот что показывает Network для этого вопроса.

введите сюда описание изображения

Первое и есть размер сжатого потока.

У меня Chrome Version 59.0.3071.104 (Official Build) (64-bit) для Mac OS

ответ дан 23 июн 2017 в 21:15

Mikhail Vaysman's user avatar

Mikhail VaysmanMikhail Vaysman

14.2k1 золотой знак20 серебряных знаков31 бронзовый знак

1

Изменить 2:

Я перечитал ваш вопрос и нашел новый способ его интерпретации. Просто найти размер файла после сжатия, используя что-то вроде bzip2 -k $file | wc -c для каждого файла. Это, однако, не решит вашу проблему, так как вас интересует не размер каждого сжатого файла, а сжатый размер архива, содержащего все ваши файлы (и насколько он увеличивается, если вы добавляете конкретный файл). Разница в размере от сжатия не является линейной, но на самом деле довольно непредсказуемой, поэтому она является плохим предиктором для второго.

Примером являются два идентичных файла размером 10 МБ, где оба сжимаются по отдельности до 1 МБ, а тарбол, содержащий оба, также сжимается до 1 МБ.

Оригинальный ответ

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

Другое решение (далеко не идеальное) работает, если вы можете иметь ручное вмешательство и может быть достаточно. Это работает лучше всего, если ваши файлы большие по сравнению с желаемым размером тома

Я так понимаю, у вас есть целевой объем тома, в МиБ. В примере я использую 700 MiB.

Если вы бежите

tout="/tmp/09b00c50a9625deeb1089b3c4358c5e5" #or something else
csize="7" # in MiB
mkfifo "$tout"
tar -cvj ~/ 2>"$tout" | dd bs=1M count="$csize" of=/dev/null iflag=fullblock 2>/dev/null &
tail -20 "$tout" | xargs -n 1 ls -ld
rm "$tout"

tar распечатает все файлы, которые он пытается сжать в канал, пока dd не получит 700 МБ сжатых данных. tail читает последние 20 файлов, которые tar пытался сжать из fifo.

Последний напечатанный файл (по крайней мере) не сможет соответствовать размеру вашего тома. Из-за кэширования как в tar и в bzip2 , некоторые из последних файлов также могут не подходить, поэтому вам, возможно, придется немного поэкспериментировать с тем, сколько из них вы пропустите. Если все файлы очень малы, вам, возможно, придется распечатать tail чтобы распечатать более 20 из них, чтобы увидеть тот, который перевернет вас.

Редактировать:

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

Открыв файл, я вывожу его размер на форме. После нажатия на кнопку запускаеться внешняя программа, которая сжимает файл, открытый в моем приложении. Хотелось бы показать его размер после сжатия. Как это можно сделать на практике? Вот структура всего процесса:

1. Открытие файла в моем приложении
2. Отображения размера файла на форме до сжатия
3. Запуск внешней программы, которая сжимает файл, открытый в моем приложении
4. Отображение размера файла на форме после сжатия //Не реализовано

Конечно, можно положить на форму кнопку, по нажатию на которую будет определяться размер после сжатия, но это мне не очень подходит.

Вот функция, с помощью которой я определяю размер файла, может, кому-нибудь сгодиться.

Код
Function GetFileSize(namefile : string) : Integer;
Var
InfoFile : TSearchRec;
AttrFile : Integer;
ErrorReturn : Integer;
Begin
AttrFile := $0000003F;
ErrorReturn := FindFirst(namefile,AttrFile,InfoFile);
 if ErrorReturn <> 0 Then
  Result := -1
 else
  Result := InfoFile.Size; {Размер файла в байтах}
FindClose(InfoFile);
End;

//Вызов функции. (выводит размер файла в байтах в Label1):
Label1.Caption:=inttostr(GetFileSize('c:kuku.txt'))+ ' байт';

Понравилась статья? Поделить с друзьями:
  • Как исправить ошибку написанную ручкой шариковой
  • Как найти свой адрес стим
  • Пещера снов ведьмак 3 как найти
  • Как найти транса для секса
  • Как составить xml схему