简体   繁体   中英

Check whether file name already exists in a folder or not?

In C++ I need to check whether a entered file name exists in that folder or not. I'm writing code for Linux, using the g++ compiler. please help guys :)

I saw this code somewhere on net for my problem but I strongly feel it wont serve my purpose:

ofstream fout(filename);
if(fout)
{
cout<<"File name already exists";
return 1;
}

You can do this by testing with an ifstream , but there is a subtle difference between using that and the C level stat() interface.

#include <cerrno>
#include <cstring>
#include <iostream>
#include <fstream>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

using namespace std;

int main (int argc, const char *argv[]) {
    if (argc < 2) {
        cerr << "Filepath required.\n";
        return 1;
    }

    ifstream fs(argv[1]);
    if (fs.is_open()) {
        fs.close();
        cout << "ifstream says file exists.\n";
    } else cout << "ifstream says file does not exist.\n";

    struct stat info;
    if ((stat(argv[1], &info)) == -1) {
        if (errno == ENOENT) cout << "stat() says file does not exist.\n";
        else cout << "stat() says " << strerror(errno) << endl;
    } else cout << "stat() says file exists.\n";

    return 0;
}
  • If you run this on a file that exists and you have read permission on , you'll get the same answer both ways.

  • If you run this on a file that does not exist, you get the same answer both ways.

  • If you run this on a file that exists but you do not have read permissions on , you'll get two different answers . fstream will say the file does not exist, but stat() will say it does. Note that if you run ls in the same directory, it will show the file, even though you cannot read it; it does exist.

So if the last case is not significant -- ie, a file you can't read might as well not exist -- then use the ifstream test. However, if it is important, then use the stat() test. See man 2 stat (the 2 is important) for more, and remember, to use it you need:

#include <cerrno>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h> 

cerrno is required to check errno if stat() fails, which can happen. For example, if read permission on a directory in the path is denied, then stat() will fail and errno will be equal to EACCES ; if you try it with the above program you'll get stat() says Permission denied . This does not mean the file exists. It means you can't check whether it exists or not.

Beware, if you have not used errno before: You must check immediately on a failed call, before you make any others which may set it differently. It is, however, thread safe.

If you want to be cross-platform and C++'y I recommend the Boost Filesystem library .

For your purposes I think something similar to this Boost sample code

#include <iostream>
#include <boost/filesystem.hpp>
using namespace boost::filesystem;

int main(int argc, char* argv[])
{
  path p (argv[1]);   // p reads clearer than argv[1] in the following code

  if (exists(p))    // does p actually exist?
  {
    if (is_regular_file(p))        // is p a regular file?   
      cout << p << " size is " << file_size(p) << '\n';

    else if (is_directory(p))      // is p a directory?
      cout << p << "is a directory\n";

    else
      cout << p << "exists, but is neither a regular file nor a directory\n";
  }
  else
    cout << p << "does not exist\n";

  return 0;
}

would do the job.

也许您想要的是fstat: http ://codewiki.wikidot.com/c:system-calls:fstat

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM