有没有比简单地尝试打开文件更好的方法?
int exists(const char *fname)
{
FILE *file;
if ((file = fopen(fname, "r")))
{
fclose(file);
return 1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用C++ 在Qt应用程序中实现文件保存功能.
我正在寻找一种方法来检查所选文件是否已经存在,然后写入它,以便我可以向用户提示警告.
我正在使用std::ofstream,我不是在寻找Boost解决方案.
在C++程序中,使用std :: ifstream,我试图打开用户指定的文件 - 到目前为止一直很好.但是,我不小心输入了一个实际上是目录的文件名,我很惊讶地发现尝试打开()该目录没有产生任何错误.
这是一个最小的例子:
std::ifstream f;
f.open("..");
if(!f.is_open() || !f.good() || f.bad() || f.fail()) {
std::cout << "error bit set on open" << std::endl;
return 1;
}
Run Code Online (Sandbox Code Playgroud)
这里没有错误的迹象.如果我继续尝试getline(),getline()会设置一个错误位.
std::string str;
getline(f, str);
if(f.eof()) std::cout << "getline set eofbit" << std::endl;
else if(f.bad()) std::cout << "getline set badbit" << std::endl;
else if(f.fail()) std::cout << "getline set failbit" << std::endl;
Run Code Online (Sandbox Code Playgroud)
这输出"getline set badbit",这是合理的.使用>>运算符会抛出一个下溢异常,这也没关系.
现在,我的问题是,我怎么能检测到用户输入了目录名而不是正确的文件名?有没有办法做到这一点?从流中获取和取消输入字节似乎很乏味且容易出错.
另外,为什么会这样呢?我意识到从程序的角度来看,它只是相同的数据,但我认为操作系统也会发送一些"嘿,这是一个目录"的消息.
这适用于仅限Windows的程序,因此可移植代码不是问题.
我只需要:
bool DoesFileExist( LPWSTR lpszFilename )
{
// ...
}
Run Code Online (Sandbox Code Playgroud)