Архиваторы: проверка файла на сжимаемость.
Несжимаемые типы файлов
Одной из задач различных упаковщиков и архиваторов является проверка сжимаемого файла на сжимаемость. Иными словами, проверка на то, стоит ли тратить время на сжатие несжимаемого файла, или оставить его в неизменном виде.
Рассмотрим алгоритм проверки файла на сжимаемость. Алгоритм реализован обычными средствами 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 с максимальной степенью сжатия.
-
RAR-архив (187 КБ) сжат (новое сжатие = 187 Кб)
WAV-файл (306 КБ) не сжат (новое сжатие = 187 Кб)
BMP-файл (938 КБ) не сжат (новое сжатие = 259 Кб)
DOC-файл (62 КБ) не сжат (новое сжатие = 13 Кб)
JPG-файл (167 КБ) сжат (новое сжатие = 168 Кб)
MP3-файл (652 КБ) сжат (новое сжатие = 639 Кб)
TXT-файл (131 КБ) не сжат (новое сжатие = 17 Кб)
HLP-файл (337 КБ) не сжат (новое сжатие = 104 Кб)
PDF-файл (1763 КБ) не сжат (новое сжатие = 1558 Кб)
EXE-файл (395 КБ) не сжат (новое сжатие = 168 Кб)
EXE-файл (упакован ASPack) (177 КБ) сжат (новое сжатие = 172 Кб)
Как видно из опытов, алгоритм успешно показывает сжимаемые и не очень сжимаемые файлы.
Дополнительная информация на тему "работа с файлами":
Apache — это кросплатформаенное программное обеспечение, относящееся к классу http-серверов. Поддерживается множеством операционных систем: Windows, Linux, MacOS и т.д. Одним из ключевых факторов в вопросе использования данного web-сервера является гибкость настройки и надежность выполнения операций. Apache включает в себя множество дополнительных модулей, позволяющих работать с различными базами данных, контролировать аутентификацию пользователей и т.д.
Интересные материалы на сайте:
Субъективная оценка результатов футбольного матча между двумя произвольными командами.
Если вирус заблокировал доступ к списку процессов windows, то эта программа может помочь на начальном этапе борьбы с вирусом.
Очищаем компьютер от мусорных файлов, высвобождая место на жестком диске.
Программа актуально против средств защиты, ограничивающих скачивание файлов из расшаренных ресурсов других компьютеров в локальной сети.