检查文件夹中是否已存在文件名?

时间:2014-07-22 15:21:59

标签: c++ linux compiler-construction g++

在C ++中,我需要检查输入的文件名是否存在于该文件夹中。我正在使用g ++编译器编写Linux代码。 请帮助伙伴:))

我在网上的某个地方看到了这个代码以解决我的问题,但我强烈认为它不符合我的目的:

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

3 个答案:

答案 0 :(得分:4)

您可以使用ifstream进行测试,但使用它和C级stat()界面之间存在细微差别。

#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;
}
  • 如果您对存在且您具有的读取权限的文件运行此操作,则您将获得相同的答案。

  • 如果您在不存在的文件上运行此操作,则会双向获得相同的答案。

  • 如果您对存在的文件运行此操作,但您没有的读取权限,则会得到两个不同的答案fstream会说该文件不存在,但stat()会说它确实存在。请注意,如果您在同一目录中运行ls,它将显示该文件,即使您无法读取它;它确实存在。

因此,如果最后一个案例并不重要 - 即,您无法阅读的文件也可能不存在 - 那么请使用ifstream测试。但是,如果它很重要,请使用stat()测试。有关更多信息,请参阅man 2 stat2非常重要),请记住,您需要使用它:

#include <cerrno>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h> 
如果cerrno失败,

errno需要检查stat(),这可能会发生。例如,如果路径中目录的读取权限被拒绝,则stat()将失败,errno将等于EACCES;如果您使用上述程序进行尝试,您将获得stat() says Permission denied这并不意味着文件存在。这意味着您无法检查文件是否存在。

请注意,如果您之前没有使用errno:您必须立即检查失败的呼叫,然后才能进行其他可能设置不同的呼叫。但是,它是线程安全的。

答案 1 :(得分:1)

如果你想要跨平台和C ++,我推荐Boost Filesystem library

出于您的目的,我认为类似于此Boost示例代码

#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;
}

可以胜任。

答案 2 :(得分:0)

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