How to Copy Files in C++
Ah, copying a file — something so simple, it happens all the time. Copy this file there; copy that file here. But what exactly takes place when you copy a file? You actually create a new file, and fill it with the same contents as the original file. And how do you do that?
Well, it sounds like you have to read each and every byte from the first file, and write it to the second. Big-time yuck.
But to make matters worse, copying a file means you have to make sure that you copy it exactly the same, that you don’t accidentally tack an extra 0 or two at the end of the file, or an extra carriage return or linefeed at the end of the file (which could happen when you copy a text file).
When all is done, the two files should be identical — not only contain the same information, but also be the same size.
And on top of all that, most good copy routines do even more! They give the new file a date that matches the date of the original file, and they will set all the attributes — including, say, read-only if the original is a read-only file. (If the file is read-only, then maybe you shouldn’t be able to copy it in the first place. . ..)
Suddenly copying a file doesn’t sound so easy after all!
If you’re programming in Windows, you’re in luck! As long as you’re not using the ancient Windows 3.1, you get a CopyFile function! To get ready to use it, you include the line #include <windows.h> in your application. Then here’s all you have to do:
CopyFile("c:/dog.txt", "c:/dog2.txt", TRUE);
This copies from c:/dog.txt to c:/dog2.txt. But notice the final parameter: It’s the word TRUE in all capitals. What’s that? That’s a preprocessor macro defined somewhere in the bowels of the Windows header files.
You have to use either TRUE or FALSE when calling any of the Windows functions. That’s because in the old days of C, when the early versions of Windows were invented, no bool type existed. Those resourceful people of the late 20th century had to define their own TRUE and FALSE as integers (usually either 1 and 0, respectively, or 0 and 1, respectively).
And by the way, that final parameter in CopyFile tells the function what to do if the file you’re copying to already exists: TRUE means don’t overwrite the existing file; just abort. FALSE means overwrite it.