Как склеить несколько файлов в один и наоборот (работа с TStream)
Лучший метод сжатия файлов: "DEL *.*" - 100% сжатие.
Как-то раз понадобилось запихнуть много файлов в один поток(stream), так как необходимо было отправить их как один файл. Вот, что для этого было сделано:
Procedure TForm1.ThisISHowIPutFilesIn ;
var
ABigFileStream, SomeSmallFiles : TMemoryStream ;
begin
ABigFileStream := TMemoryStream.Create ;
try
SomeSmallFiles := TMemoryStream.Create ;
try
SomeSmallFiles.LoadFromFile('C:\SomeSmalFile1.txt');
AddToStream(SomeSmallFiles,ABigFileStream);
SomeSmallFiles.LoadFromFile('C:\SomeSmalFile2.txt');
AddToStream(SomeSmallFiles,ABigFileStream);
// enz finally
SomeSmallFiles.Free ;
end;
ABigFileStream.SaveToFile('C:\MrBig.DDD')
finally
ABigFileStream.free ;
end;
end;
Procedure TForm1.ThisISHowIGetStufOut ;
var
ABigFileStream, SomeSmallFiles : TMemoryStream ;
begin
ABigFileStream := TMemoryStream.Create ;
try
ABigFileStream.LoadFromFile('C:\MrBig.DDD');
SomeSmallFiles := TMemoryStream.Create ;
try
GetFromStream(ABigFileStream,SomeSmallFiles,0);
SomeSmallFiles.SaveToFile('C:\SomeSmalFile1.txt');
GetFromStream(ABigFileStream,SomeSmallFiles,1);
SomeSmallFiles.SaveToFile('C:\SomeSmalFile2.txt');
// и т.д.finally
SomeSmallFiles.Free ;
end;
finally
ABigFileStream.free ;
end;
end;
Procedure TForm1.AddToStream ( Source , Dest : TStream );
var
Size : Integer ;
begin
Source.position := 0 ;
// Сохраняем размер, помещая его в первый байт
Size := Source.Size ;
Dest.Write(Size,SizeOf(Integer));
Dest.CopyFrom(Source,Source.size);
end;
Procedure TForm1.GetFromStream ( Source , Dest : TStream ; Index : Integer );
Var
Size , I : Integer ;
begin
Source.Position := 0 ;
For i := 0 to index-1 dobegin
Source.Read(Size,SizeOf(Integer));
Source.Position := Source.Position + Size ;
end;
// Если марк¸р в файле равен размеру, то что-то пошло не так :(if Source.position = Source.Size thenRaise EAccessViolation.Create('Index Out Of Bounds') ;
// Получаем желаемый размер файла
Source.Read(Size,SizeOf(Integer));
// Очищаем буфер у Dest
Dest.Position := 0 ;
Dest.Size := 0 ;
Dest.CopyFrom(Source,Size);
end;
Код, который вы предоставили, используется для объединения нескольких маленьких файлов в один большой файл (или поток) и наоборот.
Вот разбивка кода:
Объединение файлов
Процедура AddToStream используется для добавления маленького файла (SomeSmallFiles) в более крупный поток (ABigFileStream). Она сохраняет размер маленького файла как целое число в начале, а затем содержимое файла.
Процедура ThisISHowIPutFilesIn создает большой поток (ABigFileStream) и загружает несколько маленьких файлов в него с помощью цикла.
Разделение файлов
Процедура GetFromStream используется для извлечения конкретного маленького файла из более крупного потока (ABigFileStream). Она сначала читает размер желаемого файла как целое число, а затем копирует содержимое файла из потока в новый маленький файл.
Процедура ThisISHowIGetStufOut загружает большой поток (ABigFileStream) и извлекает несколько маленьких файлов с помощью цикла.
Некоторые предложения по улучшению:
Вместо загрузки каждого маленького файла отдельно в память,consider загружать их.concurrently или в batches для улучшения производительности.
Используйте механизмы обработки ошибок (например, блоки try-except) для ловли потенциальных ошибок, которые могут возникнуть при объединении или разделении файлов.
Рассмотрите использование более эффективного алгоритма для объединения и разделения файлов, например, использования одного большого буфера вместо нескольких маленьких.
В отношении комментария о том, что "DEL ." является 100%-методом сжатия, он не имеет отношения к предоставленному коду. DEL *.* на самом деле является командой в оболочке Windows, которая удаляет все файлы с любым расширением (*.*) из текущего каталога.
В статье описывается способ склеивания нескольких файлов в один и наоборот с помощью TStream и его применения в различных задачах.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.