2010-11-30 26 views
29

yazmadan önce dosyanın mevcut olup olmadığını kontrol edin C++ kullanarak bir Qt uygulamasında dosya kaydetme işlevselliği uyguluyorum.std :: ofstream,

Seçili dosyanın önceden yazılmadan önce var olup olmadığını kontrol etmenin bir yolunu arıyorum, böylece kullanıcıya uyarı gönderebilirim.

std::ofstream kullanıyorum ve Boost çözümü arıyorum.

+1

Olası yinelenen sorular: http://stackoverflow.com/questions/1383617/how-to-check-if-a-file-exists-and-is-readable-in-c, http://stackoverflow.com/questions/574285/denetleme-of-a-txt-dosya-ile-c-code, http://stackoverflow.com/questions/268023/whats-the-best-way-to-check-if-a -file-in-c-çapraz platform –

+0

bir çift ekleyin: http://stackoverflow.com/questions/12774207/fastest-way-to-check-if-a-file-exist-using-standard-c -c11-c – zhangxaochen

cevap

60

Bu Birden kullanımlar için yandan tutmak benim favori Tuck koyma işlevlerinden biridir deneyin.

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

bulduğum bu çok daha zevkli Eğer I/O için Kullanmaya hiç derhal niyetlerini varsa bir dosyayı açmaya çalışırken daha.

+2

+1, statüyü kullanarak, yalnızca kapatmak için bir dosya açmak yerine. –

+5

Stat standart değil mi? – HighCommander4

+12

+1 ancak 'return stat (filename.c_str(), & buf)! = 1;' daha küçüktür. –

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 

Varolan bir dosya durumunda, bu rasgele erişim modunda açılacağını unutmayın. Tercih ederseniz, kapatabilir ve ekleme veya kesme modunda yeniden açabilirsiniz.

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

Bu yöntem şu ana kadar en kısa ve en taşınabilir olanıdır. Kullanım çok karmaşık değilse, bunun için giderdim. Ayrıca bir uyarı sormak isterseniz, bunu ana bölümde yapacağım.

+7

Açıklama: Dosyayı okumaya çalışmak için ifstream yapıcısını kullanır. Fonksiyon döndüğünde ve ifstream kapsam dışına çıktığında, yıkıcı dosyayı dolaylı olarak kapatacaktır (dosyanın var olması ve açıklığın başarılı olması durumunda). – grubs

2

Yoldan biri, stat() yapmak ve errno'u kontrol etmek olacaktır.
bir örnek kod bakmak bu görünecektir:

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

Bu akışın bakılmaksızın çalışır. Hala ofstream kullanarak kontrol etmeyi tercih ediyorsanız, sadece is_open()'u kullanarak kontrol edin.
Örnek: Bu yardımcı olur

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

Umut. Teşekkürler!