确定目录是否可写

时间:2014-08-18 19:53:06

标签: c++ unit-testing exception boost ofstream

我需要在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;在这种情况下。

1 个答案:

答案 0 :(得分:-2)

stat是你的朋友。

stat, fstat, lstat - get file status 

如果您正在使用提升,请考虑boost::filesystem