We help IT Professionals succeed at work.

Check out our new AWS podcast with Certified Expert, Phil Phillips! Listen to "How to Execute a Seamless AWS Migration" on EE or on your favorite podcast platform. Listen Now

x

Copy file

kmorris1186
kmorris1186 asked
on
Medium Priority
8,415 Views
Last Modified: 2010-02-21
Hi all,

I am new to Delphi but am migrating from VB.  It is a big change.  I have a program that pulls Zip files from a CD (it gets this list from a Access 97 Database) and puts then in a directory.  I have looked around and cant find any way to copy single files.  I found many resources on copying directorys, but not single files.  I found somthing on the "SHFileOpStruct", but being new to Delphi i have no idea what it is.  Guessing it is somthing similar to the FileSystemObject.

Please give me some examples with as many comments as you can fit in there.  It will help me understand it.  Goes from reading Visual basic to Delphi is rough (for me anyway).

Thanks!
Comment
Watch Question

Commented:
Unlock this solution with a free trial preview.
(No credit card required)
Get Preview
Top Expert 2004

Commented:
found this in my paq

uses shellapi;

procedure TForm1.Button1Click(Sender: TObject);
var I : Integer;
    opInfo : _SHFILEOPSTRUCT;
begin
  opInfo.pFrom := 'd:\TmpFolder';  //SourceFolder
  opInfo.pTo   := 'u:\';  //DestinationFolder
  //opInfo.wFunc := FO_MOVE;  //Move it
  //opInfo.wFunc := FO_COPY;  //Copy it
  opInfo.fFlags := FOF_NOCONFIRMATION  or //no confirmation
                   FOF_NOCONFIRMMKDIR or
 //no confirmation                  FOF_RENAMEONCOLLISION or //rename if dest exist
                   FOF_SIMPLEPROGRESS;  //show a progress
  opInfo.hNameMappings := nil;  // no mappings
  opInfo.fAnyOperationsAborted := False; //obsolete
  opInfo.lpszProgressTitle := 'Moving . . .';  //foo simpleprogressdisplay
  opInfo.Wnd := self.handle;  //the parent of the progressdisplay
  SHFileOperation(opInfo);  //do it
end;

meikl ;-)


Commented:
meikl,
I thought he need to copy singel files "I have looked around and cant find any way to copy single files" !
Top Expert 2004

Commented:
hmm, yes, you're correct, k4

Author

Commented:
k4hvd77 - so if i wanted to copy a file... i could do this :

procedure TForm1.Button1Click(Sender: TObject);
var
    strSource : String;
    strDest : String;
begin

strSource := edit1.text  // user entered 'c:\testfile.txt'
strDest := edit2.text  // user entered 'd:\testdir\'

copyfile(PChar(strSource),PChar(strDest),True)

end;


That should copy c:\testfile.txt to d:\testdir\testfile.txt correct? (i am not at a box with Delphi right now, sorry.)

Author

Commented:
and one more thing.  Am i going to have to add any thing in the USES section? or is this a pocedure that is built in to delphi?

Commented:
no, you don't need anythig more in Uses Section.

Commented:
or something like that:

procedure Copyfile (strSource : String; strDest : String; Overwrite : Boolean );
begin
   if Overwrite then
      begin
         copyfile(PChar(strSource),PChar(strDest),True);
      end
      else
      begin
         copyfile(PChar(strSource),PChar(strDest),False);  
      end;
end;

   

Author

Commented:
ok.. since i am not at a box with delphi,  Will this work with a UNC path?

(either way, you get the points tomorrow when i get to work to test this out.)

Commented:
try it later and accept my answer if it works ;)
Commented:
Unlock this solution with a free trial preview.
(No credit card required)
Get Preview

Commented:
My code copy a single file from source to destination. In same time let you to know the copy stage ( progress ).
If don't wish to know it I mark what to delete as just to copy.

Commented:
Me again. :P Look better if use :

8<----
 with ProgressBar do begin  // delete if don't wish to show the progress
    Min := 0; // delete if don't wish to show the progress
    Max := FileLength;   // delete if don't wish to show the progress

    while FileLength > 0 do begin
      BlockRead( FromF, Buffer[ 0 ], SizeOf( Buffer ), NumRead );
      FileLength := FileLength - NumRead;
      BlockWrite( ToF, Buffer[ 0 ], NumRead );
      Position := Position + NumRead;
    end;

 end; // delete if don't wish to show the progress
 
 CloseFile( FromF );
 CloseFile( ToF );

--------->8

The code work perfect in one of my projects. In same time, I use a procedure to verify if I make a right copy. If interested you ...ask.
 
Top Expert 2004

Commented:
well, my version :-))

var
  source, target : TFileStream;
begin
  source := TfileStream.Create('SourcePathFileNameHere',fmOpenRead);
  target := TfileStream.Create('TargetPathFileNameHere',fmCreate);
  target.Copyfrom(source,0);
  target.free;
  source.free;
end;

just from head

meikl ;-)

Commented:
Hi everybody, my version works under both Linux and MS Windows:

Delphi syntax:      function CopyFileTo(const Source, Destination: string): Boolean;

Example:

uses
  .... IdGlobal;

  if CopyFileTo(SourceFileName, TargetFileName) then
  begin
    // The copy is successful
  end;

emil

Author

Commented:
k4hvd77 - Thanks! that will do what i need.

ginsonic - Thanks for the extra info! i should be able to use it.



Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a free trial preview!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.