Solved

Concatenating  files programmatically

Posted on 1997-10-09
259 Views
I want to append or concatenate together some files programmatically. Is there a way I can call the DOS 'COPY' command from Delphi, so I can issue the command 'COPY file1.txt+file2.txt+file3.txt result.txt? Or is there some Delphi command that will do it for me?

Thanks,
Shawn Halfpenny

P.S: new e-mail address : drumme59@sprint.ca
0
Question by:aztec
• 6
• 3

LVL 12

Accepted Solution

andrewjb earned 50 total points
procedure TForm1.Button1Click(Sender: TObject);
var
lOut : tFileStream;
lIn  : tFileStream;
begin
lOut := tFileStream.Create( 'c:\temp\out' , fmCreate );

lIn  := tFileStream.Create( 'c:\temp\in.1' , fmOpenRead );
lOut.CopyFrom( lIn , lIn.Size );
lIn.Free;

lIn := tFileStream.Create( 'c:\temp\in.2' , fmOpenRead );
lOut.CopyFrom( lIn , lIn.Size );
lIn.Free;

{ etc.! }

lOut.Free;
end;
0

LVL 3

Expert Comment

Or just trap exceptions from the filestream objects ....

0

LVL 12

Expert Comment

Yes, but if you need progress bar then what ?
0

LVL 3

Expert Comment

Then copy not all in one step, but this is the same as BlockRead. This is only other idea.
0

LVL 3

Expert Comment

0

LVL 3

Expert Comment

The second parameter of the Create call can lock the file, I think.

0

LVL 12

Expert Comment

Yes You have right. The direct file functions is better only when more than one user often updates the file. Better means so You can write program easly. Stupid example can be file for conversation within some users (I say so this is stupid !).
Thank you. I just will be using whenever it is possible FileStream.
0

LVL 3

Expert Comment

function ConcatFiles(inFilename1,inFilename2,outFilename : string) : boolean;
const BUFFERSIZE                = $FFFF; var inFile1, inFile2, outFile : file; buffer : pointer; readbytes : integer; begin {$I-}

{Open all the files}
AssignFile(inFile1,inFilename1); Reset(inFile1,1);
if IOResult <> 0 then begin ConcatFiles := false; exit end;
AssignFile(inFile2,inFilename2); Reset(inFile2,1);
if IOResult <> 0 then begin ConcatFiles := false; exit end;
AssignFile(outFile,outFilename); ReWrite(outFile,1);
if IOResult <> 0 then begin ConcatFiles := false; exit end;

{allocate memory for the buffer}
getMem(buffer,BUFFERSIZE);

{copy file 1}
while not EOF(inFile1) do begin
end;

{copy file 2}
while not EOF(inFile2) do begin
end;

{free the buffer memory}
freeMem(buffer,BUFFERSIZE);

{close all the files}
CloseFile(inFile1); CloseFile(inFile2); CloseFile(outFile);

{\$I+}
ConcatFiles := true;
end;

0

Expert Comment

hi mes ! This differs from my comment only in buffer. Your buffer is better of course, but answer from adrewjb is the best.
0

LVL 3

Expert Comment

Hi, I'd like to re-submit my grade for AndrewJB's answer to this. He really did give an excellent answer - it works beautifully - so I'd like to give him an A.

Cheers
Shawn Halfpenny
drumme59@sprint.ca
0

Featured Post

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
Access reports are powerful and flexible. Learn how to create a query and then a grouped report using the wizard. Modify the report design after the wizard is done to make it look better. There will be another video to explain how to put the final p…
Here's a very brief overview of the methods PRTG Network Monitor (https://www.paessler.com/prtg) offers for monitoring bandwidth, to help you decide which methods you´d like to investigate in more detail.  The methods are covered in more detail in o…