![]() |
|
|
#1
|
|||
|
|||
|
Привет, такой вопрос:
Есть куча файлов в формате jpeg необходимо их все запихнуть в один файл, с возможностью извлечения отдельного файла изображения. |
|
#2
|
||||
|
||||
|
|
|
#3
|
|||
|
|||
|
Спасибо, но добавлять файлы нужно динамически без использования ресурсов.
Вот что нужно было: Код:
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;
|
|
#4
|
||||
|
||||
|
Кстити, можешь еще эти потоки сжимать (а по необходимости разжимать) ZLib'ом, компонент DelphiZLib (http://www.dellapasqua.com/delphizli...sp?q2=download) тебе очень поможет.
|
|
#5
|
|||
|
|||
|
Если сжимать эти потоки, то эта операция будет занимать процессорное время, а для меня это важно ,а размер файла ны выходе особого значения не имеет!
![]() |