在继续我的程序之前,如何检查目录中是否存在文件?我已经阅读了尝试使用各种方法打开文件的答案,但我的问题是,大多数情况下,我正在检查的文件将损坏并且无法打开。这发生在我的程序的错误检查部分,只有在前面的代码中发生错误时才会触发。我想检查文件是否存在,如果是,则要求删除它,否则只打印一些消息。
我该如何解决这个问题?
(只是删除并接受错误会起作用,但我这样做是为了学习,所以我想要正确地做到这一点......)
编辑:
我已经下载了Boost以使用文件系统库并编译它,看似没有错误,但是当我尝试编译我的程序时,我得到了这个回复:
g++ program.cpp -I <path to>/boost_1_54_0 -o output
Undefined symbols for architecture x86_64:
"boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)", referenced from:
boost::filesystem::exists(boost::filesystem::path const&)in cc1XX8rD.o
"boost::system::system_category()", referenced from:
__static_initialization_and_destruction_0(int, int)in cc1XX8rD.o
"boost::system::generic_category()", referenced from:
__static_initialization_and_destruction_0(int, int)in cc1XX8rD.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
我在程序中使用boost的唯一地方是:
boost::filesystem::path my_file(s4);
if (boost::filesystem::exists(my_file)){ ...
答案 0 :(得分:4)
使用stat()
或access()
:
#include <unistd.h>
int res = access(path, R_OK);
if (res < 0) {
if (errno == ENOENT) {
// file does not exist
} else if (errno == EACCES]) {
// file exists but is not readable
} else {
// FAIL
}
}
答案 1 :(得分:3)
可以打开存在但包含损坏数据的文件,但不会产生任何不良影响。只要您不尝试读取文件的内容。
但是,任何“检查是否存在”均受TOCTUI约束,并且首先是非常不必要的。只是尝试删除文件并接受删除可能并不总是有效是一种更好的方法。
答案 2 :(得分:2)
如果您在项目中使用Boost,那么可以使用Boost.Filesystem:
#include <boost/filesystem.hpp>
boost::filesystem::path my_file("some/path/some_file");
if (boost::filesystem::exists(my_file))
{
boost::filesystem::remove(my_file);
}
else
{
std::cout << "File does not exist!" << std::endl;
}
此解决方案可在多个系统Boost.Filesystem Implementation中移植。
答案 3 :(得分:-2)
你想在不试图打开的情况下这样做。如果你改变主意并尝试打开文件:
bool file_exists(std::string filename){
ifstream ifile(filename);
return ifile;
}
有人说,这会自动关闭。我不知道。
而且,如果你不想打开文件,我认为有很多机会。我可以说一个缓慢的,老式的和丑陋的解决方案,也许其他人会告诉你更好的解决方案。这是:
system("dir > something.abc");
之后,你必须打开something.abc文件,然后解析/解释这些行。你必须打开something.abc文件,但是,你不必打开那个你要分析的文件。
这个解决方案会非常慢(0.5秒,这对于100个文件来说不是很好),你必须编写很多代码,这将非常复杂地解析/解释“dir”命令的答案。