Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как склеить несколько файлов в один и наоборот (работа с TStream)

Delphi , Файловая система , Файлы

Как склеить несколько файлов в один и наоборот (работа с 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 do
   begin
     Source.Read(Size,SizeOf(Integer));
     Source.Position := Source.Position + Size ;
   end;
// Если марк¸р в файле равен размеру, то что-то пошло не так :(
if Source.position = Source.Size then
  Raise EAccessViolation.Create('Index Out Of Bounds') ;
// Получаем желаемый размер файла
Source.Read(Size,SizeOf(Integer)); 
// Очищаем буфер у Dest
Dest.Position := 0 ; 
Dest.Size := 0 ; 
Dest.CopyFrom(Source,Size); 
end;

Код, который вы предоставили, используется для объединения нескольких маленьких файлов в один большой файл (или поток) и наоборот.

Вот разбивка кода:

Объединение файлов

  1. Процедура AddToStream используется для добавления маленького файла (SomeSmallFiles) в более крупный поток (ABigFileStream). Она сохраняет размер маленького файла как целое число в начале, а затем содержимое файла.
  2. Процедура ThisISHowIPutFilesIn создает большой поток (ABigFileStream) и загружает несколько маленьких файлов в него с помощью цикла.

Разделение файлов

  1. Процедура GetFromStream используется для извлечения конкретного маленького файла из более крупного потока (ABigFileStream). Она сначала читает размер желаемого файла как целое число, а затем копирует содержимое файла из потока в новый маленький файл.
  2. Процедура ThisISHowIGetStufOut загружает большой поток (ABigFileStream) и извлекает несколько маленьких файлов с помощью цикла.

Некоторые предложения по улучшению:

  • Вместо загрузки каждого маленького файла отдельно в память,consider загружать их.concurrently или в batches для улучшения производительности.
  • Используйте механизмы обработки ошибок (например, блоки try-except) для ловли потенциальных ошибок, которые могут возникнуть при объединении или разделении файлов.
  • Рассмотрите использование более эффективного алгоритма для объединения и разделения файлов, например, использования одного большого буфера вместо нескольких маленьких.

В отношении комментария о том, что "DEL ." является 100%-методом сжатия, он не имеет отношения к предоставленному коду. DEL *.* на самом деле является командой в оболочке Windows, которая удаляет все файлы с любым расширением (*.*) из текущего каталога.

В статье описывается способ склеивания нескольких файлов в один и наоборот с помощью TStream и его применения в различных задачах.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Файлы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-26 17:53:54/0.0038177967071533/0