如何在创建新文件之前检查文件是否存在

Lio*_*ing 27 c++ file

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

我的尝试

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的一部分(参见此处).


CBI*_*III 8

尝试

ifstream my_file("test.txt");
if (my_file)
{
 // do stuff
}
Run Code Online (Sandbox Code Playgroud)

来自:如何检查文件是否存在且在C++中是否可读?

或者您可以使用增强功能.

  • 如果您没有该文件的读取权限,这可能不起作用.当然,在大多数情况下你无论如何都无法写入它 - 但是有一些系统具有奇怪的权限,你可能拥有没有读取权限的写权限,因此会破坏你的文件. (2认同)

dum*_*dad 7

试试这个(来自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则返回,否则返回.


Jam*_*orn 6

从C++ 17开始,有:

if (std::filesystem::exists(pathname)) {
   ...
Run Code Online (Sandbox Code Playgroud)

  • 它花了19年...... xD (3认同)