Учитывая boost::filesystem::path p
, возможно ли иметь boost::filesystem::is_regular_file(p) == true
и std::ifstream(p.c_str()).is_open() == false
в то же время? Если да, в какой ситуации?Какая у меня гарантия после is_regular_file?
Контекст сочинительстве утверждают для функции сравнения:
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());
// ...
// ...
// ...
}
Я нахожу, что для большинства операций с файловой системой лучше лучше просить прощение, чем разрешить * парадигма (в отличие от парадигмы * перед вами). В вашем случае это означает, что 'is_regular_file (p1)' является избыточной проверкой, потому что в любом случае вам всегда понадобится 'f1.is_open()'. – Escualo
Но 'f1.is_open()' is 'true', когда' p1' является каталогом. – Caduchon
Затем сначала сделайте 'f1.is_open()', а затем выполните 'is_regular_file()', вы можете воспользоваться коротким замыканием: 'if (f1.is_open() и f1.is_regular_file())' – Escualo