// efg, October 2000, www.efg2.com/Lab // Combine five given files, 1.DAT, 2.DAT, 3.DAT, 4.DAT, 5.DAT into a // single COMBINED.DAT file. Split the COMBINED.DAT file back into // the original files, but with a new extension, 1.BIN, 2.BIN, ... unit ScreenCombineSplit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) ButtonCombine: TButton; ButtonSplit: TButton; procedure ButtonCombineClick(Sender: TObject); procedure ButtonSplitClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} CONST FileList : ARRAY[1..5] OF STRING = ('1.DAT', '2.DAT', '3.DAT', '4.DAT', '5.DAT'); CombinedFile = 'Combined.DAT'; procedure TForm1.ButtonCombineClick(Sender: TObject); VAR i : INTEGER; s : ARRAY[1..5] OF STRING; size : INTEGER; Stream : TMemoryStream; begin FOR i := Low(FileList) TO High(FileList) DO BEGIN // Load files into strings IF FileExists(FileList[i]) THEN BEGIN Stream := TMemoryStream.Create; TRY Stream.LoadFromFile(FileList[i]); SetLength(s[i], Stream.Size); Stream.Read(s[i][1], Stream.Size) FINALLY Stream.Free END END ELSE s[i] := ''; END; // Could encrypt the strings here if desired // Save strings to single binary file DeleteFile(CombinedFile); Stream := TMemoryStream.Create; TRY FOR i := Low(s) TO High(s) DO BEGIN size := LENGTH(s[i]); Stream.Write(size, SizeOf(size)); Stream.Write(s[i][1], size); END; Stream.SaveToFile(CombinedFile) FINALLY Stream.Free END; ButtonSplit.Enabled := TRUE end; procedure TForm1.ButtonSplitClick(Sender: TObject); VAR buffer : STRING; i : INTEGER; InFileStream : TFileStream; OutFileStream: TFileStream; size : INTEGER; begin InFileStream := TFileStream.Create(CombinedFile, fmOpenRead OR fmShareDenyNone); TRY // split combined file ito separate files // with extension .BIN instead of .DAT FOR i := Low(FileList) TO High(FileList) DO BEGIN InFileStream.Read(size, SizeOf(size)); SetLength(buffer, size); InFileStream.Read(buffer[1], size); // Could decrypt the strings here if desired // Write new file OutFileStream := TFileStream.Create(ChangeFileExt(FileList[i], '.BIN'), fmCreate or fmOpenWrite or fmShareExclusive); TRY OutFileStream.Write(buffer[1], size) FINALLY OutFileStream.Free END END FINALLY InFileStream.Free END end; end.