|
#1
|
|||
|
|||
Куча JPEG
Привет, такой вопрос:
Есть куча файлов в формате 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) тебе очень поможет.
THE CRACKER IS OUT THERE |
#5
|
|||
|
|||
Если сжимать эти потоки, то эта операция будет занимать процессорное время, а для меня это важно ,а размер файла ны выходе особого значения не имеет!
|