C++
  Home arrow C++ arrow Page 3 - Focusing on C++ Files
Dev Articles Forums 
ADO.NET  
Apache  
ASP  
ASP.NET  
C#  
C++  
ColdFusion  
COM/COM+  
Delphi-Kylix  
Design Usability  
Development Cycles  
DHTML  
Embedded Tools  
Flash  
Graphic Design  
HTML  
IIS  
Interviews  
Java  
JavaScript  
MySQL  
Oracle  
Photoshop  
PHP  
Reviews  
Ruby-on-Rails  
SQL  
SQL Server  
Style Sheets  
VB.Net  
Visual Basic  
Web Authoring  
Web Services  
Web Standards  
XML  
Mobile Linux 
App Generation ROI 
IBM® developerWorks 
Weekly Newsletter
 
Developer Updates  
Free Website Content 
 RSS  Articles
 RSS  Forums
 RSS  All Feeds
Write For Us Get Paid 
Request Media Kit
Contact Us 
Site Map 
Privacy Policy 
Support 
 USERNAME
 
 PASSWORD
 
 
  >>> SIGN UP!  
  Lost Password? 
C++

Focusing on C++ Files
By: O'Reilly Media
  • Search For More Articles!
  • Disclaimer
  • Author Terms
  • Rating: 3 stars3 stars3 stars3 stars3 stars / 2
    2008-10-30

    Table of Contents:
  • Focusing on C++ Files
  • 10.7 Copying a File
  • 10.8 Deleting or Renaming a File
  • 10.9 Creating a Temporary Filename and File

  • Rate this Article: Poor Best 
      ADD THIS ARTICLE TO:
      Del.ici.ous Digg
      Blink Simpy
      Google Spurl
      Y! MyWeb Furl
    Email Me Similar Content When Posted
    Add Developer Shed Article Feed To Your Site
    Email Article To Friend
    Print Version Of Article
    PDF Version Of Article
     
     
    ADVERTISEMENT


    Focusing on C++ Files - 10.8 Deleting or Renaming a File


    (Page 3 of 4 )

    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 <cstdio>, will do this. See Example 10-11 for a brief demonstration of them.

    Example 10-11. Removing a file

    #include <iostream>
    #include <cstdio>
    #include <cerrno>

    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 <cstdio>) 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 <iostream>
    #include <string>
    #include <boost/filesystem/operations.hpp> #include <boost/filesystem/fstream.hpp>

    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

    More C++ Articles
    More By O'Reilly Media


       · This article is an excerpt from the book "C++ Cookbook," published by O'Reilly. We...
     

    Buy this book now. This article is excerpted from chapter 10 of the C++ Cookbook, written by Ryan Stephens, Christopher Diggins, Jonathan Turkanis and Jeff Cogswell (O'Reilly; ISBN: 0596007612). Check it out today at your favorite bookstore. Buy this book now.

    C++ ARTICLES

    - More Tricks to Gain Speed in Programming Con...
    - Easy and Efficient Programming for Contests
    - Preparing For Programming Contests
    - Programming Contests: Why Bother?
    - Polymorphism in C++
    - Overview of Virtual Functions
    - Inheritance in C++
    - Extending the Basic Streams in C++
    - Using Stringstreams in C++
    - Custom Stream Manipulation in C++
    - General Stream Manipulation in C++
    - Serialize Your Class into Streams in C++
    - Advanced File Handling with Streams in C++
    - File Handling and Streams in C++
    - The STL String Class







    © 2003-2010 by Developer Shed. All rights reserved. DS Cluster 7 Hosted by Hostway
    For more Enterprise Application Development news, visit eWeek