Concatenating files programmatically

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
aztecAsked:
Who is Participating?
 
andrewjbConnect With a Mentor Commented:
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
 
mirek071497Commented:
Or just trap exceptions from the filestream objects ....

0
 
andrewjbCommented:
Yes, but if you need progress bar then what ?
0
Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

 
mirek071497Commented:
Then copy not all in one step, but this is the same as BlockRead. This is only other idea.
0
 
mirek071497Commented:
adrewjb - Sorry for my next comment, but what about sharing ? I don;t know if it is possible with stream. Do you know about this.
0
 
mirek071497Commented:
The second parameter of the Create call can lock the file, I think.

0
 
andrewjbCommented:
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
 
mirek071497Commented:
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
    BlockRead(inFile1,buffer^,BUFFERSIZE,readbytes);
    BlockWrite(outFile,buffer^,readbytes);
  end;

  {copy file 2}
  while not EOF(inFile2) do begin
    BlockRead(inFile2,buffer^,BUFFERSIZE,readbytes);
    BlockWrite(outFile,buffer^,readbytes);
  end;

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

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

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


0
 
mesCommented:
hi mes ! This differs from my comment only in buffer. Your buffer is better of course, but answer from adrewjb is the best.
0
 
mirek071497Commented:
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
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.