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

Поиск:

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


Опытный
**


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

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



:Приветствую
Хочу вот разобрать такой вопрос: Как мона программно заархивировать и разархивировать файлы?
Исследуемый архив содержит несколько файлов. При запуске программы нужно его разархивировать куда надо, а, поработав с его файлами, заархивировать их обратно.
Если есть маленькие проги-архиваторы (любые, желательно поменьше размером), то посоветуйте.
Вот, помогите. плз


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


Творец
****


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

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



поищи по форуму, это не первый топик
PM MAIL   Вверх
Marriage
Дата 25.1.2005, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Компонентики есть :-)
Если дашь мыло - вышлю smile
Сам использую, и хелп есть.

Это сообщение отредактировал(а) Marriage - 25.1.2005, 15:41


--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
RA
Дата 25.1.2005, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


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

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



Цитата(Marriage @ 25.1.2005, 15:36)
Сам использую - чуть-чуть (на 100-150 байт хуже RAR-a  )


А мне? интересно что это за алгоритм такой, небось ppm2 извращенный.

PM   Вверх
dm9
Дата 25.1.2005, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



PM MAIL ICQ   Вверх
Marriage
Дата 25.1.2005, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мда ...
С моим траффиком до конца месяца ничего не получиться ...
ДАю Линк ...


ZipForge, 2.40
http://soft.mail.ru/program_page.php?grp=7112

Юзайте на здоровье.




--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
RA
Дата 25.1.2005, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


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

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



ZipForge, 2.40 Знаем знаем, только это старье уже есть 2.59 и
вообще лутше всего качать с офф сайтов.
PM   Вверх
Dark Wanderer
Дата 25.1.2005, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 25.10.2004
Где: Кишинёв

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



Ещё есть FlexCompres. Создатели обещают сжати лучше чем у WinRar, в чём и убедился. В компоненте есть функция шифрования.
--------------------
  
PM MAIL   Вверх
Budy
Дата 26.1.2005, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Marriage, гуд! А поменьше нету компонентика?


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


Опытный
**


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

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



Budy
Поискал бы, да траффика осталось 8 метров до 1 февраля ...
smile

Цитата

ZipForge, 2.40 Знаем знаем, только это старье уже есть 2.59


Архив называется zf_259, наверно это и есть последние smile

Это сообщение отредактировал(а) Marriage - 26.1.2005, 16:30


--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
Snowy
Дата 26.1.2005, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Это нужно перепробовать кучу компонентов и определить, который тебе больше подходит. Вряд ли кто задавался этой целью. Как правило на 2-м - 3-м компоненте находят наиболее подходящий и успокаиваются.
Я использую компонент, который дает минимальный размер программы 100кб (без использоватия Forms).
А использовать стандартный ZLib не пробовал? Может для твоих целей хватит и этого?
PM MAIL   Вверх
Budy
Дата 26.1.2005, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ZLib smile
Добавлено @ 20:10
Мнето впринципе любой, даже без сжатия мона. Главно чтоб мона было 12 файлов в один объединить


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


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Может, тогда самому можно написать, без сжатия? smile
PM MAIL ICQ   Вверх
Budy
Дата 27.1.2005, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Каким образом? У меня 4 шт. BMP, 7 шт. TXT и 1 шт. со своей кодировкой.
Ха, я раньше пробовал такой ерундой заниматься, делал так:

Для каждого из n файлов сначала записывал его размер с пробелами на конце, чтоб потом считавать удобно было (ex: '1234 '), т.е. скока в нем символов, а потом попорядку переписывал символы из етого файла в свой. Разкодировка аналогична.
Вот тока с большими файлами (>2 Mb) тормозит. Хотя работает отлично smile
Ну, принципе такой свой код меньше текста в проге займет smile

Добавлено @ 08:22
А, забыл совсем, мне зачем архивто надо! чтоб без запуска программы мона было и самому посмотреть что там.


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


Эксперт
****


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

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



Вариант №1 - засунуть все в ресурс.
Вариант №2:
Код

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

При сохранении количество файлов известно. offset первого файла будет (SizeOf(TFileNfo)+1)*kolvo. Заполняешь структуру первого файла, прописываешь в файл. К смещению первого файла прибавляешь его размер, получаешь смещение второго. Пишешь второй и т.д. Потом делаешь структуру, где имя файла=''; Тоже запихиваешь в файл. Потом просто туда же загоняешь файлы.
В результате у тебя в начале файла будет список файлов с именами, размерами и смещением в файле. Читать файл просто: Считываешь заголовки. Находишь нужное имя. Получаешь смещение, делаешь Seek в это место, делаешь BlockRead размером файла. Все файл в памяти. Работает очень быстро, особенно, если сразу считать все заголовки в память, а не считывать каждый раз. Для файлов до 100Мб будет работать быстрее архиватора.
На винте, правда, будет занимать побольше, но инсталлящию можно также целиком в архив запихать, так что размер тут не пострадает.
PM MAIL   Вверх
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   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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