我想向文件中输入一些内容,但是我想先检查一下我想创建的文件名是否存在。如果是这样,即使该文件为空,我也不想创建任何文件。

我的尝试

bool CreateFile(char name[], char content[]){
     std::ofstream file(name);
     if(file){
         std::cout << "This account already exists" << std::endl;
        return false;
     }
     file << content;
     file.close();
     return true;
}

有什么方法可以做我想要的吗?

最佳答案

假设该操作不是原子操作,可以执行以下操作:

if (std::ifstream(name))
{
     std::cout << "File already exists" << std::endl;
     return false;
}
std::ofstream file(name);
if (!file)
{
     std::cout << "File could not be created" << std::endl;
     return false;
}
...

请注意,如果您运行多个线程尝试创建同一文件,则此方法将无效,并且由于存在TOCTUI问题,因此肯定不会阻止第二个进程“干扰”文件的创建。 [我们首先检查文件是否存在,然后创建它-但其他人可能在检查和创建之间创建了它-如果这很关键,则您需要做其他不能移植的操作]。

另一个问题是,如果您拥有诸如文件不可读(因此我们无法打开它进行读取)但可写的权限,它将覆盖文件。

在大多数情况下,这一切都不重要,因为您关心的只是以“尽力而为”的方式告诉某人“您已经拥有这样的文件”(或类似的文件)。

07-26 09:34
查看更多