Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Архивация программно, Архивация программно 
:(
    Опции темы
Snowy
Дата 27.1.2005, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Вот набросал решение. Немного корявенько, но работает.
Если хорошо печесать репу, то можно оптимизировать по скорости.
Если еще сильнее почесать, то можно написать класс для работы с файлами AllInOne;
Код

type
 TFileNfo=packed record
   fn: string[8];
   size: integer;
   offset: LongInt;
 end;

procedure Save(fn:string; fl:TStringList); // сохранить файлы в один // fn-имя файла, fl-список файлов, которые запихивать
var
 k,i:  integer;
 f:    TFileStream;
 s:    file;
 o:    integer;
 r:    TFileNfo;
 p:    ^byte;
begin
 f:=TFileStream.Create(fn,fmCreate);
 k:=fl.Count;
 f.Write(k,SizeOf(k)); // сохраняем количество файлов
 o:=SizeOf(r)*k+SizeOf(k); // смещение первого файла
 if k>0 then for i:=0 to k-1 do begin // сохраняем заголовки
   Assign(s,fl[i]); Reset(s,1);
   r.fn:=fl[i]; r.size:=FileSize(s);
   r.offset:=o; o:=o+r.size;
   f.Write(r,SizeOf(r));
   CloseFile(s);
 end;
 if k>0 then for i:=0 to k-1 do begin // сохраняем файлы
   Assign(s,fl[i]); Reset(s,1);
   r.size:=FileSize(s);
   GetMem(p,r.size);
   BlockRead(s,p^,r.size,r.offset);
   f.Write(p^,r.size);
   FreeMem(p,r.size);
   CloseFile(s);
 end;
 f.Free;
end;

procedure Load(fl, fn:string; var s:TMemoryStream); // чтение нужного файла из кучи
var
 k,i:  integer;
 f:    TFileStream;
 p:    ^byte;
 r:    TFileNfo;
begin
 f:=TFileStream.Create(fl,fmOpenRead);
 s.Clear;
 f.Read(k,SizeOf(k)); i:=0; // читаем количество файлов
 while i<k do begin // читаем заголовки файлов пока не найдем нужный
   f.ReadBuffer(r,SizeOf(r));
   if r.fn=fn then i:=k; // так можно получить и список файлов в файле
   inc(i);
 end;
 if i>k then begin //если есть нужный файл - читаем его
   f.Seek(r.offset,soFromBeginning);
   GetMem(p,r.size);
   f.ReadBuffer(p^,r.size);
   s.WriteBuffer(p^,r.size); // и запихиваем в стрим
   FreeMem(p,r.size);
 end;
 f.Free; s.Position:=0;
end;

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

procedure TForm1.Button1Click(Sender: TObject);
var
 fl: TStringList;
begin
 fl:=TStringList.Create;
 fl.Add('odin.txt');
 fl.Add('dva.txt');
 fl.Add('tri.txt');
 Save('file.dat',fl);
 fl.Free;
end;

А теперь пример чтения файла. Чтение идет в TMemoryStream, потому что почти все компоненты, несущие информацию имеют функцию LoadFromStream;
Код

procedure TForm1.Button2Click(Sender: TObject);
var
 m: TMemoryStream;
begin
 m:=TMemoryStream.Create;
 Load('file.dat','tri.txt',m);
 memo1.Lines.LoadFromStream(m);
 m.Free;
end;

PM MAIL   Вверх
Budy
Дата 27.1.2005, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 616
Регистрация: 6.2.2004
Где: Екатеринбург

Репутация: 1
Всего: 2



Snowy, отлично! Код посмотрел вроде должно сработать, счас попробую. smile


--------------------
Как ты назовешь свой корабль, так на нем и напишут
user posted image
PM MAIL WWW ICQ   Вверх
dimonskif
Дата 2.4.2006, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 6.1.2006

Репутация: нет
Всего: нет



А чтобы разархивировать
Код

m.SaveToFile('tri.txt');

smile ?
PM MAIL   Вверх
Snowy
Дата 2.4.2006, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Угу. Это не трудно было и самому проверить ;)
Добавлено @ 09:11
Кстати, если тебе нужно просто сохранять, то вместо TMemoryStream используй TFileStream.
PM MAIL   Вверх
ne0n
Дата 2.4.2006, 13:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 5.8.2005
Где: Н.Новгород

Репутация: 1
Всего: 11



Вот хороший пример, сам использовал для создания BackUp'ов, при помощи ZLib:
Код

uses
   Zlib;

...

procedure CompressFiles(Files : TStrings; const Filename : String);
 var
   infile, outfile, tmpFile : TFileStream;
   compr : TCompressionStream;
   i,l : Integer;
   s : String;

 begin
   if Files.Count > 0 then
   begin
     outFile := TFileStream.Create(Filename,fmCreate);
     try
    l := Files.Count;
       outfile.Write(l,SizeOf(l));
       for i := 0 to Files.Count-1 do
       begin
         infile := TFileStream.Create(Files[i],fmOpenRead);
         try
          s := ExtractFilename(Files[i]);
           l := Length(s);
           outfile.Write(l,SizeOf(l));
           outfile.Write(s[1],l);
          l := infile.Size;
           outfile.Write(l,SizeOf(l));
           tmpFile := TFileStream.Create('tmp',fmCreate);
           compr := TCompressionStream.Create(clMax,tmpfile);
           try
             compr.CopyFrom(infile,l);
           finally
             compr.Free;
             tmpFile.Free;
           end;
           
           tmpFile := TFileStream.Create('tmp',fmOpenRead);
           try
             outfile.CopyFrom(tmpFile,0);
           finally
             tmpFile.Free;
           end;
         finally
           infile.Free;
         end;
       end;
     finally
       outfile.Free;
     end;
     DeleteFile('tmp');
   end;
 end;

 procedure DecompressFiles(const Filename, DestDirectory : String);
 var
   dest,s : String;
   decompr : TDecompressionStream;
   infile, outfile : TFilestream;
   i,l,c : Integer;
 begin
 dest := IncludeTrailingPathDelimiter(DestDirectory);
  infile := TFileStream.Create(Filename,fmOpenRead);
   try
   infile.Read(c,SizeOf(c));
     for i := 1 to c do
     begin
     infile.Read(l,SizeOf(l));
       SetLength(s,l);
       infile.Read(s[1],l);
      infile.Read(l,SizeOf(l));
      s := dest+s; //include the path 
      outfile := TFileStream.Create(s,fmCreate);
       decompr := TDecompressionStream.Create(infile);
       try
         outfile.CopyFrom(decompr,l);
       finally
         outfile.Free;
         decompr.Free;
       end;
     end;
   finally
     infile.Free;
   end;
 end;





PM MAIL ICQ   Вверх
hairbaton
Дата 25.3.2009, 22:27 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 25.3.2009

Репутация: нет
Всего: нет



Пытаюсь склеить 2 файла методом

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  fl: TStringList;
begin
  fl:=TStringList.Create;
  fl.Add('1.wav');
  fl.Add('2.wav');
  fl.SaveToFile('result.wav');
  fl.Free;
end;


Файл result создается, но не проигрывается. Собственно вопрос в чем дело и что я не так делаю, и можно ли вообще таким методом склеить эти 2 wav файла? Я посмотрел много источников, но так и не нашел нормального объяснения соединения 2 wav файлов. 


Это сообщение отредактировал(а) hairbaton - 25.3.2009, 22:43
PM MAIL   Вверх
Akella
Дата 27.3.2009, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(hairbaton @  25.3.2009,  22:27 Найти цитируемый пост)
Пытаюсь склеить 2 файла методом


Цитата(hairbaton @  25.3.2009,  22:27 Найти цитируемый пост)
TStringList

 smile 

TStringList для работы со строками.

Добавлено через 1 минуту и 1 секунду
hairbaton, и вообще из названия темы можно узнать, что речь здесь об архивировании.
PM MAIL   Вверх
Romikgy
Дата 27.3.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



hairbaton, файлы не так склеиваются , да и wav файлы просто так не склеишь 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Akella
Дата 27.3.2009, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



и это в тяпницу вечером такие вот вопросы, а, это ж издевательство  над мосгомsmile 
PM MAIL   Вверх
hairbaton
Дата 27.3.2009, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 25.3.2009

Репутация: нет
Всего: нет



Может тогда можно как-то просто склеить midi файлы? 
PM MAIL   Вверх
Akella
Дата 27.3.2009, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



hairbaton, ты так и не понял? ты говоришь о склеивании файлов в теме об архивировании! Создай новую тему, дай осмысленное название и опиши проблему.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0845 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.