Solved

Why does CopyFile never fail?

Posted on 2008-10-21
4
609 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 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

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Delphi component that can load a DLL in design time? 8 92
select query - oracle 16 101
creating threads in delphi 1 157
update joined tables 2 62
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…
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…
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…

735 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