我需要在C ++程序中确定Linux文件系统上的目录是否可写。我的原始(天真)解决方案是打开一个文件并尝试使用ofstream
写入它,但流不会抛出异常(除非你打开它们)。
这是我的尝试#1。请注意,/tmp/protectedstorage-test/mnt
在运行测试用例之前以只读方式挂载:
class create_test_file_failed {};
void create_test_file() {
std::ofstream os;
os.open("/tmp/protectedstorage-test/mnt/test_file", std::ofstream::out | std::ofstream::trunc);
if (os.fail())
throw create_test_file_failed{};
os << MAGIC_NUMBER;
os.close();
}
bool not_writable_exception_check(std::exception const& ex) {
return true;
}
BOOST_FIXTURE_TEST_CASE ( uninitialized_mirror_test ) {
BOOST_CHECK_EXCEPTION(create_test_file, create_test_file_failed, not_writable_exception_check);
}
但是,os.fail()
似乎总是返回false。我也试过os.bad()
但没有成功。
所以,这是我的第二次尝试:
void create_test_file() {
std::ofstream os;
os.exceptions(std::ofstream::failbit | std::ofstream::badbit);
os.open("/tmp/protectedstorage-test/mnt/test_file", std::ofstream::out | std::ofstream::trunc);
os << MAGIC_NUMBER;
os.close();
}
bool not_writable_exception_check(std::exception const& ex) {
return true;
}
BOOST_FIXTURE_TEST_CASE ( uninitialized_mirror_test ) {
BOOST_CHECK_EXCEPTION(create_test_file, std::exception, not_writable_exception_check);
}
运行单元测试时会出现以下消息:
halfmirror_test.cpp(66): error in "uninitialized_mirror_test": exception std::exception is expected
如果我删除宏BOOST_CHECK_EXCEPTION
并只是调用该函数,我会收到以下消息,暗示从std::exception
派生的异常被抛出:
unknown location(0): fatal error in "uninitialized_mirror_test": std::exception: basic_ios::clear
由于basic_ios::clear
是一种方法,而不是一种类型,因此我似乎应该抓住std::exception
......
这里发生了什么?为什么没有fail()
工作?什么类型被抛出,所以我可以验证它实际上被扔了?
我已经看到其他答案表明检查文件权限是实现此目的的最佳方式,但这些权限并不能在只读文件系统上告诉您任何内容 - 具有可写权限的文件实际上并非如此#39;在这种情况下。