Std:: ofstream, проверьте, существует ли файл перед записью

Я реализую функции сохранения файлов в приложении Qt с использованием С++.

Я ищу способ проверить, существует ли выбранный файл перед его записью, чтобы я мог вызывать предупреждение пользователю.

Я использую std::ofstream, и я не ищу решение Boost.

Ответ 1

Это одна из моих любимых функций, которые я держу под рукой для нескольких целей.

#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;
}

Я нахожу это намного более вкусным, чем попытка открыть файл, если у вас нет непосредственных намерений использовать его для ввода-вывода.

Ответ 2

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

Этот метод является самым коротким и самым переносимым. Если использование не очень сложное, это то, за что я бы пошел. Если вы также хотите вызвать предупреждение, я сделаю это в основном.

Ответ 3

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

Обратите внимание, что в случае существующего файла это откроет его в режиме произвольного доступа. Если вы предпочитаете, вы можете закрыть его и снова открыть в режиме добавления или усечения.

Ответ 4

Попробуйте ::stat() (объявлено в <sys/stat.h>)

Ответ 5

Один из способов - сделать 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

Надеюсь, это поможет. Спасибо!