Solved

Why does CopyFile never fail?

Posted on 2008-10-21
4
603 Views
Last Modified: 2010-08-05
I am using CopyFile to make a backup of an important file. It seems that CopyFile always returns true, even if the path is not accessible, or the disk or file are read-only. What system do you recommend to make sure that the file has been copied successfully?
ERROR := Not CopyFile(PChar(ConfigFilename),PChar(ConfigBackup),False);

Open in new window

0
Comment
Question by:momsoft2
  • 2
  • 2
4 Comments
 
LVL 13

Expert Comment

by:ThievingSix
ID: 22769131
Here's a dirty way to get it done. There are better ways to do it though.
function CopyFile(lpExistingFileName, lpNewFileName: PChar; bFailIfExists: LongBool): LongBool;

var

  FileStreamExisting,

  FileStreamNew : TFileStream;

  Buffer : PChar;

begin

  Result := False;

  If (bFailIfExists) And (FileExists(lpNewFileName)) Then Exit;

  FileStreamExisting := TFileStream.Create(lpExistingFileName,fmOpenRead);

  FileStreamNew := TFileStream.Create(lpNewFileName,fmCreate);

  Try

    If FileStreamNew.CopyFrom(FileStreamExisting,0) = FileStreamExisting.SIze Then

      begin

      Result := True;

    end;

  Finally

    FileStreamExisting.Free;

    FileStreamNew.Free;

  end;

end;

Open in new window

0
 

Author Comment

by:momsoft2
ID: 22769474
Thank you very much. This is definitely a step in the right direction.

Your function does indeed fail if the destination is invalid, but then, the original file stays locked and I get errors if I try to access it again.
0
 
LVL 13

Accepted Solution

by:
ThievingSix earned 125 total points
ID: 22769819
This should always free it with or without exceptions.
function CopyFile(lpExistingFileName, lpNewFileName: PChar; bFailIfExists: LongBool): LongBool;

var

  FileStreamExisting,

  FileStreamNew : TFileStream;

  Buffer : PChar;

begin

  Result := False;

  If (bFailIfExists) And (FileExists(lpNewFileName)) Then Exit;

  FileStreamExisting := TFileStream.Create(lpExistingFileName,fmOpenRead);

  Try

    FileStreamNew := TFileStream.Create(lpNewFileName,fmCreate);

    Try

      If FileStreamNew.CopyFrom(FileStreamExisting,0) = FileStreamExisting.SIze Then

        begin

        Result := True;

      end;

    Finally

      FileStreamNew.Free;

    end;

  Finally

    FileStreamExisting.Free;

  end;

end;

Open in new window

0
 

Author Closing Comment

by:momsoft2
ID: 31508387
Thank you very much for your help!
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

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…
Have you ever had your Delphi form/application just hanging while waiting for data to load? This is the article to read if you want to learn some things about adding threads for data loading in the background. First, I'll setup a general applica…
Internet Business Fax to Email Made Easy - With  eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, f…
Video by: Mark
This lesson goes over how to construct ordered and unordered lists and how to create hyperlinks.

911 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now