考虑boost::filesystem::path p
,是否可以同时拥有boost::filesystem::is_regular_file(p) == true
和std::ifstream(p.c_str()).is_open() == false
?如果是,在哪种情况下?
上下文是为比较函数编写断言:
bool identical_files(const boost::filesystem::path& p1, const boost::filesystem::path& p2)
{
assert(boost::filesystem::is_regular_file(p1));
assert(boost::filesystem::is_regular_file(p2));
std::ifstream f1(p1.c_str());
assert(f1.is_open()); // IS THIS REDUNDANT ???
std::ifstream f2(p2.c_str());
assert(f2.is_open());
// ...
// ...
// ...
}
答案 0 :(得分:4)
唯一的保证是,在通话时,路径是常规文件。由于文件系统隐式是竞争条件,boost::filesystem::is_regular_file(p1)
和std::ifstream f1(p1.c_str())
之间的通话实际上可能是指两个不同的对象。
考虑一下情景:
boost::filesystem::is_regular_file(p1)
,成功并确定它是"正常"文件p1
std::ifstream f1(p1.c_str())
,无法打开文件你能看到这里的竞争状况吗?