std :: ofstream,在写入之前检查文件是否存在

时间:2010-11-30 17:11:31

标签: c++ stream std fstream ofstream

我正在使用C ++在 Qt 应用程序中实现文件保存功能。

我正在寻找一种方法来检查所选文件在写入之前是否已存在,以便我可以向用户发出警告。

我使用的是std::ofstream,我不是在寻找 Boost 解决方案。

6 个答案:

答案 0 :(得分:62)

这是我最喜欢的隐藏功能之一,我可以随时使用它。

#include <sys/stat.h>
// Function: fileExists
/**
    Check if a file exists
@param[in] filename - the name of the file to check

@return    true if the file exists, else false

*/
bool fileExists(const std::string& filename)
{
    struct stat buf;
    if (stat(filename.c_str(), &buf) != -1)
    {
        return true;
    }
    return false;
}

如果您没有立即将其用于I / O,我发现这比尝试打开文件更有品味。

答案 1 :(得分:38)

bool fileExists(const char *fileName)
{
    ifstream infile(fileName);
    return infile.good();
}

这种方法是迄今为止最短且最便携的方法。如果使用不是很复杂,这是我想要的。如果您还想提示警告,我会在主要部分进行。

答案 2 :(得分:10)

fstream file;
file.open("my_file.txt", ios_base::out | ios_base::in);  // will not create file
if (file.is_open())
{
    cout << "Warning, file already exists, proceed?";
    if (no)
    { 
        file.close();
        // throw something
    }
}
else
{
    file.clear();
    file.open("my_file.txt", ios_base::out);  // will create if necessary
}

// do stuff with file

请注意,如果是现有文件,则会以随机访问模式打开它。如果您愿意,可以关闭它并以追加模式或截断模式重新打开它。

答案 3 :(得分:4)

尝试::stat()(在<sys/stat.h>中声明)

答案 4 :(得分:2)

其中一种方法是stat()并查看errno 示例代码看起来如下:

#include <sys/stat.h>
using namespace std;
// some lines of code...

int fileExist(const string &filePath) {
    struct stat statBuff;
    if (stat(filePath.c_str(), &statBuff) < 0) {
        if (errno == ENOENT) return -ENOENT;
    }
    else
        // do stuff with file
}

无论流如何,这都有效。如果您仍然希望使用ofstream进行检查,请使用is_open()进行检查 示例:

ofstream fp.open("<path-to-file>", ofstream::out);
if (!fp.is_open()) 
    return false;
else 
    // do stuff with file

希望这会有所帮助。 谢谢!

答案 5 :(得分:1)

使用C ++ 17的std::filesystem::exists

#include <filesystem> // C++17
#include <iostream>
namespace fs = std::filesystem;

int main()
{
    fs::path filePath("path/to/my/file.ext");
    std::error_code ec; // For using the noexcept overload.
    if (!fs::exists(filePath, ec) && !ec)
    {
        // Save to file, e.g. with std::ofstream file(filePath);
    }
    else
    {
        if (ec)
        {
            std::cerr << ec.message(); // Replace with your error handling.
        }
        else
        {
            std::cout << "File " << filePath << " does already exist.";
            // Handle overwrite case.
        }
    }
}

另见std::error_code

如果您想检查您要写入的路径是否实际上是常规文件,请使用std::filesystem::is_regular_file