2010-11-30 4 views
29

Я реализую функцию сохранения файлов в приложении Qt с использованием C++.std :: ofstream, проверьте, существует ли файл перед записью

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

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

+1

Возможные дублирующие вопросы: http://stackoverflow.com/questions/1383617/how-to-check-if-a-file-exists-and-is-readable-in-c, http://stackoverflow.com/questions/574285/check-exist-of-a-txt-file-with-c-code, http://stackoverflow.com/questions/268023/whats-the-best-way-to-check-if-a -file-exists-in-c-cross-platform – 2010-11-30 17:18:49

+0

Добавить дубликат: http://stackoverflow.com/questions/12774207/fastest-way-to-check-if-a-file-exist-using-standard-c -c11-c – zhangxaochen 2016-04-04 04:35:55

ответ

60

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

#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

+1 для примера, используя stat вместо открытия файла только для его закрытия. – 2011-06-10 15:23:22

7
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 

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

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

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

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 

Надеется, что это помогает. Спасибо!