Solved

Why does CopyFile never fail?

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

Courses: Start Training Online With Pros, Today

Brush up on the basics or master the advanced techniques required to earn essential industry certifications, with Courses. Enroll in a course and start learning today. Training topics range from Android App Dev to the Xen Virtualization Platform.

Question has a verified solution.

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

Suggested Solutions

Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
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…
Two types of users will appreciate AOMEI Backupper Pro: 1 - Those with PCIe drives (and haven't found cloning software that works on them). 2 - Those who want a fast clone of their boot drive (no re-boots needed) and it can clone your drive wh…
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…

776 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