在C ++中,我需要检查输入的文件名是否存在于该文件夹中。我正在使用g ++编译器编写Linux代码。 请帮助伙伴:))
我在网上的某个地方看到了这个代码以解决我的问题,但我强烈认为它不符合我的目的:
ofstream fout(filename);
if(fout)
{
cout<<"File name already exists";
return 1;
}
答案 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 stat
(2
非常重要),请记住,您需要使用它:
#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