我想向文件中输入一些内容,但是我想先检查一下我想创建的文件名是否存在。如果是这样,即使该文件为空,我也不想创建任何文件。
我的尝试
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问题,因此肯定不会阻止第二个进程“干扰”文件的创建。 [我们首先检查文件是否存在,然后创建它-但其他人可能在检查和创建之间创建了它-如果这很关键,则您需要做其他不能移植的操作]。
另一个问题是,如果您拥有诸如文件不可读(因此我们无法打开它进行读取)但可写的权限,它将覆盖文件。
在大多数情况下,这一切都不重要,因为您关心的只是以“尽力而为”的方式告诉某人“您已经拥有这样的文件”(或类似的文件)。