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
Надеюсь, это поможет.
Спасибо!