如何生成不存在的文件的名称并阻止其创建?

时间:2013-12-04 09:07:05

标签: c++ linux unix

我想在我的程序中测试“没有这样的文件”行为。要做到这一点(当然)我需要一些文件名,这将指向不存在的文件。

生成此类文件名的方法是什么,并保证其不存在直到测试结束? - 我没有任何想法,所以我实际上什么也没做过。

我想用C ++实现它,但实际上,它不是特定于C ++的问题。


更新#1

至少在Linux上找到解决方案是可以接受的。

3 个答案:

答案 0 :(得分:2)

可能无法获得100%的保证,但你可以 轻松防止其他用户创建的任何内容 首先创建一个只有你拥有访问权限的目录, 然后在那里创建文件。在那之后,这取决于你 确保你不做任何你不想做的事情。 (作为一般 规则,任何时候你需要临时文件,创建一个目录 属于你,只有你有权访问,是一个很好的 预防性举措。)

答案 1 :(得分:0)

在Windows上使用_tempnam,在POSIX(例如Linux或OSX)上使用tempnam

答案 2 :(得分:0)

实际上不可能创建一个不存在的文件名(竞争条件)。您可以使用stdio函数'char * tmpnam(char * s);获取名称。这会生成一个难以猜测的名称。

您可以组成一个流来避免名称被猜到的不太可能的情况:

class NoFStream : public std::fstream
{
    public:
    NoFStream(const char*, ios_base::openmode = ios_base::in | ios_base::out) {
        setstate(ios_base::failbit);
    }

    void open(const char*, ios_base::openmode = ios_base::in | ios_base::out) {
        setstate(ios_base::failbit);
    }
};

int main()
{
    NoFStream f("/tmp/file");
    if(f >> std::ws) std::cout << "This will not succeed" << std::endl;
    else std::cout << "Ok - it fails" << std::endl;
    return 0;
}