Архиваторы: проверка файла на сжимаемость.
Несжимаемые типы файлов
Поделиться: ![]() ![]() ![]() ![]() ![]() ![]() |
Одной из задач различных упаковщиков и архиваторов является проверка сжимаемого файла на сжимаемость. Иными словами, проверка на то, стоит ли тратить время на сжатие несжимаемого файла, или оставить его в неизменном виде.
Рассмотрим алгоритм проверки файла на сжимаемость. Алгоритм реализован обычными средствами Delphi 5 с использованием функций FileOpen, ReadFile и FileClose.
Теоретически, несжимаемый файл, это файл, частоты байт от 0 до 255 которого находятся примерно в одном диапазоне величин. Т.е. частота каждого символа примерно равна 0,39%. Расчеты ведутся на файлах, длина которых более 10 Кб. Если просуммировать все частоты, то в результате получим 100%.
Сжимаемые файлы - это файлы, разброс частот которых очень велик. Например, в звуковых файлах (формат WAV) частота некоторых байт доходит до десятков процентов, а других - до сотых процента. В текстовых файлах некоторые байты вообще не встречаются.
Итак, рассмотрим этапы определения сжимаемости файла:



Чтение файла в память:
Var Fname: string; // абсолютный или относительный путь к файлу FileHandle : THandle; // указатель на открываемый файл inBuf : PChar; // указатель на область памяти, куда будет прочитан файл c_inBuf : Cardinal; // размер прочитанного в память файла a : array[0..255] of Longword; // массив частот Max_Buf : Integer; // максимальный размер памяти для чтения файла .................... // устанавливаем максимальный размер файла для тестов и выделяем память Max_Buf := 10000000; GetMem(inBuf,Max_Buf); FileHandle := FileOpen (fname, fmShareDenyNone); try ReadFile(fileHandle, inBuf^,Max_Buf-1,c_inBuf, nil); finally FileClose(fileHandle); end;
В результате выполнения функций, в памяти, по адресу, на который ссылается переменная inBuf, будет находиться образ прочитанного файла.
Подсчет частот символов:
if c_inBuf > 0 then begin for i := 0 to 255 do a[i] := 0; for i := 0 to c_inBuf do inc(a[ord(inBuf[i])]); end;
После это шага в каждой ячейке массив "a" находится количество встреченных символов, код которых равен номеру ячейки.
Если просуммировать значения всех ячеек массива, то получим число, равное размеру файла.
Проверка на уже сжатые данные:
x1 := c_inBuf / 236; x2 := c_inBuf / 266; j := 0; for i := 0 to 255 do if (a[i] < x1) and (a[i] > x2) then inc(j); if j > 25 then // файл уже сжат else // файл не сжат
Переменные x1 и x2 указывают процентный диапазон, в котором происходит сравнение. Если количество символов с частотой из этого процентного диапазона больше четвертой части всех символов, то можно утверждать, что файл уже прошел процедуру сжатия.
Итоги тестирования алгоритма:
Данная процедура сравнения прошла испытание на файлах нескольких типов. Замечание: параметр "новое сжатие" указывает на новый размер файла после его сжатия архиватором WinRar с максимальной степенью сжатия.











Как видно из опытов, алгоритм успешно показывает сжимаемые и не очень сжимаемые файлы.
Дополнительная информация на тему "работа с файлами":
Apache — это кросплатформаенное программное обеспечение, относящееся к классу http-серверов. Поддерживается множеством операционных систем: Windows, Linux, MacOS и т.д. Одним из ключевых факторов в вопросе использования данного web-сервера является гибкость настройки и надежность выполнения операций. Apache включает в себя множество дополнительных модулей, позволяющих работать с различными базами данных, контролировать аутентификацию пользователей и т.д. |
Интересные материалы на сайте:
|
![]() |