![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Архивирование
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]Написать программу.