Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Архивирование


Страницы:   1 2

qwe ©   (2005-03-14 10:21:00) 

Помогите пожалуйста в следеющем вопросе. Есть N файлов и их необходимо собрать в 1 архив , конечно же средствами Delphi


qwe   (2005-03-14 19:05:00) [1]

спасибо выручил seregka  , то начинают , то вопрос не поняли, то не так поставил:)))))


seregka   (2005-03-14 18:55:00) [2]

Для 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
      { the number of files }
      l := Files.Count;
      outfile.Write(l,SizeOf(l));
      for i := 0 to Files.Count-1 do
      begin
        infile := TFileStream.Create(Files[i],fmOpenRead);
        try
          { the original filename }
          s := ExtractFilename(Files[i]);
          l := Length(s);
          outfile.Write(l,SizeOf(l));
          outfile.Write(s[1],l);
          { the original filesize }
          l := infile.Size;
          outfile.Write(l,SizeOf(l));
          { compress and store the file temporary}
          tmpFile := TFileStream.Create('tmp',fmCreate);
          compr := TCompressionStream.Create(clMax,tmpfile);
          try
            compr.CopyFrom(infile,l);
          finally
            compr.Free;
            tmpFile.Free;
          end;
          { append the compressed file to the destination file }
          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
  // IncludeTrailingPathDelimiter (D6/D7 only)
 dest := IncludeTrailingPathDelimiter(DestDirectory);

  infile := TFileStream.Create(Filename,fmOpenRead);
  try
    { number of files }
    infile.Read(c,SizeOf(c));
    for i := 1 to c do
    begin
      { read filename }
      infile.Read(l,SizeOf(l));
      SetLength(s,l);
      infile.Read(s[1],l);
      { read filesize }
      infile.Read(l,SizeOf(l));
      { decompress the files and store it }
      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;


qwe   (2005-03-14 15:03:00) [3]

о пасибо :))))


NE_Parovoz   (2005-03-14 14:48:00) [4]

qwe
ZLib.pas


qwe   (2005-03-14 14:31:00) [5]

leonidus это стандартный дельфийский компонет?


leonidus   (2005-03-14 13:46:00) [6]

Юзай VCLZip


XP   (2005-03-14 12:14:00) [7]

Статистика говорит, что на 90% вопросов можно отвечать односложно: http://www.torry.net


Anatoly Podgoretsky   (2005-03-14 12:11:00) [8]

Не надо путать сжатие и архивирование, второе подразумевает тольно одно - создание архивной копии.


qwe   (2005-03-14 12:09:00) [9]

ну да про алгорит сжатия я не говоил , но имелл ввиду
а вот Erik1  про компоненты можно поподробнее


XP   (2005-03-14 12:06:00) [10]

Я бы сказал по-другому.
Сжатие данных - полезная функция любого архиватора.
На самом деле, архивация, по определению, не предусматривает сжатия данных как такового.
Поэтому, насколько я помню, все "архиваторы" (в данном контексте это слово не совсем верное), как ZIP, так и RAR и иже с ними, могут просто "заливать" несколько файлов в один, не выполняя при этом никакой "упаковки".

А про алгоритм возможного сжатия автор вопроса не сказал ни слова.


raidan   (2005-03-14 12:01:00) [11]

>XP   (14.03.05 11:54) [11]
Аналог tar'а.
tar без ключика на сжатие не является архиватором.


XP   (2005-03-14 11:54:00) [12]

но мне сказали что бы сделал архивацию

Делайте перед каждым записываемым файлом заголовок с названием исходного файла, размером, списком аттрибутов и пр.

P.S. И, когда пишете в вопросе "собрать", не забудьте уточнить, надо ли Вам его потом "разбирать".


Erik1   (2005-03-14 11:48:00) [13]

Можно использовать архиватор, например Dll которому можно передать список файлов и команду. Конечно есть возможность использовать компонент(ZipTV), но это для небольших архивов(<100Мб)


qwe   (2005-03-14 11:24:00) [14]

да? ну ладно пасибо , проверим


Anatoly Podgoretsky   (2005-03-14 11:22:00) [15]

Это и есть архивная, компаундная копия.


qwe   (2005-03-14 11:21:00) [16]

так подожди , это получится мы сольем все файлы в один, это я уже делал , но мне сказали что бы сделал архивацию ,


XP   (2005-03-14 11:19:00) [17]

1. Создать нетипизированный конечный файл.
2. Открывать по очереди исходные файлы, читать в буфер и писать в конечный файл. Не забывать закрыть исходный файл.
3. Закрыть конечный файл.

AssignFile(DestinationFile, );
Rewrite(DestinationFile);
try
 for i := 0 to SourceFileCount - 1 do
 begin
   AssignFile(SourceFile, );
   Reset(SourceFile);
   try
     BlockRead(SourceFile, );
     BlockWrite(DestinationFile, );
   finally
     CloseFile(SourceFile);
   end;  
 end;  
finally
 FileClose(DestinationFile);
end;


Или то же самое, но через потоки TFileStream.


Anatoly Podgoretsky   (2005-03-14 11:17:00) [18]

Ну так задавай конкретный вопрос, а не ходи вокруг да около.


qwe   (2005-03-14 11:16:00) [19]

ннндааааа  пасибо , очень помог


Anatoly Podgoretsky   (2005-03-14 11:14:00) [20]

Написать программу.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо