Deleting or Renaming a File

Problem

You have to remove or rename a file, and you want to do it portably, i.e., without using OS-specific APIs.

Solution

The Standard C functions remove and rename, in , will do this. See Example 10-11 for a brief demonstration of them.

Example 10-11. Removing a file

#include 
#include 
#include 

using namespace std;

int main(int argc, char** argv) {

 if (argc != 2) {
 cerr << "You must supply a file name to remove." << endl;
 return(EXIT_FAILURE);
 }

 if (remove(argv[1]) == -1) { // remove( ) returns -1 on error
 cerr << "Error: " << strerror(errno) << endl;
 return(EXIT_FAILURE);
 }
 else {
 cout << "File '" << argv[1] << "' removed." << endl;
 }
}

 

Discussion

These system calls are easy to use: just call one or the other with the filename you want to delete or rename. If something goes wrong, the return value is non-zero and errno is set to the appropriate error number. You can use strerror or perror (both declared in ) to print out the implementation-defined error message.

To rename a file, you can replace the remove call in Example 10-11 with the following code:

if (rename(argv[1], argv[2])) {
 cerr << "Error: " << strerror(errno) << endl;
 return(EXIT_FAILURE);
}

The Boost Filesystem library also provides the ability to remove or rename a file. Example 10-12 shows a short program for removing a file (or directory, but see the discussion after the example).

Example 10-12. Removing a file with Boost

#include 
#include 
#include 
#include 

using namespace std;
using namespace boost::filesystem;

int main(int argc, char** argv) {

 // Do parameter checking...

 try {
 path p = complete(path(argv[1], native));
 remove(p);
 }
 catch (exception& e) {
 cerr << e.what( ) << endl;
 }
 return(EXIT_SUCCESS);
}

The important part of Example 10-12 is the remove function. Call it with a valid path argument that refers to a file or an empty directory, and it will be removed. For an explanation of the path class and complete function, both of which are part of the Boost Filesystem library, take a look at the discussion in Recipe 10.7. See Recipe 10.11 for an example of how to remove a directory and all the files it contains.

Renaming a file or directory is similar. Replace the code in the TRy block in Example 10-12 with this code:

path src=complete(path(argv[1], native));
path dst = complete(path(argv[2], native));
rename(src, dst);

This will rename src to dst, so long as each is a valid path. src and dst don't have to have a common base directory, and in that respect, the rename function logically moves a file or directory to a new base directory, so long as dst exists.

See Also

Recipe 10.7





C++ Cookbook
Secure Programming Cookbook for C and C++: Recipes for Cryptography, Authentication, Input Validation & More
ISBN: 0596003943
EAN: 2147483647
Year: 2006
Pages: 241
Simiral book on Amazon

Flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net