我想将一些内容输入到文件中,但我想首先检查是否存在名称我想创建的文件.如果是这样,即使文件为空,我也不想创建任何文件.
我的尝试
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;
}
Run Code Online (Sandbox Code Playgroud)
有什么办法可以做我想要的吗?
Mat*_*son 27
假设操作不是原子的,你可以这样做:
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;
}
...
Run Code Online (Sandbox Code Playgroud)
请注意,如果您运行多个线程尝试创建相同的文件,这不起作用,当然也不会阻止第二个进程"干扰"文件创建,因为您有TOCTUI问题.[我们首先检查文件是否存在,然后创建它 - 但是其他人可以在检查和创建之间创建它 - 如果这很关键,你将需要做一些其他的,这是不可移植的].
另一个问题是,如果您具有诸如文件不可读的权限(因此我们无法打开它以进行读取)但是可写,则它将覆盖该文件.
在大多数情况下,这些事情都不重要,因为你所关心的只是在"尽力而为"的方法中告诉某人"你已经拥有这样的文件"(或类似的东西).
ale*_*son 13
你也可以使用Boost.
boost::filesystem::exists( filename );
Run Code Online (Sandbox Code Playgroud)
它适用于文件和文件夹.
并且您将拥有一个接近C++ 14的实现的实现,其中文件系统应该是STL的一部分(参见此处).
尝试
ifstream my_file("test.txt");
if (my_file)
{
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
或者您可以使用增强功能.
试试这个(来自Erik Garrison的复制版:https://stackoverflow.com/a/3071528/575530)
#include <sys/stat.h>
bool FileExists(char* filename)
{
struct stat fileInfo;
return stat(filename, &fileInfo) == 0;
}
Run Code Online (Sandbox Code Playgroud)
stat0如果文件存在-1则返回,否则返回.
从C++ 17开始,有:
if (std::filesystem::exists(pathname)) {
...
Run Code Online (Sandbox Code Playgroud)