?
Solved

Why does CopyFile never fail?

Posted on 2008-10-21
4
Medium Priority
?
621 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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 500 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

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
If you’ve ever visited a web page and noticed a cool font that you really liked the look of, but couldn’t figure out which font it was so that you could use it for your own work, then this video is for you! In this Micro Tutorial, you'll learn yo…
How to fix incompatible JVM issue while installing Eclipse While installing Eclipse in windows, got one error like above and unable to proceed with the installation. This video describes how to successfully install Eclipse. How to solve incompa…
Suggested Courses

765 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