2008-11-06 19 views
80

मैंने What's the best way to check if a file exists in C? (cross platform) के उत्तरों को पढ़ा है, लेकिन मुझे आश्चर्य है कि क्या मानक सी ++ libs का उपयोग करके ऐसा करने का बेहतर तरीका है? फ़ाइल को खोलने की कोशिश किए बिना अधिमानतः।यह जांचने का सबसे अच्छा तरीका क्या है कि फ़ाइल C++ में मौजूद है या नहीं? (क्रॉस प्लेटफार्म)

stat और access दोनों बहुत अधिक अप्राप्य हैं। इनका उपयोग करने के लिए मुझे #include क्या चाहिए?

+0

पहुंच के लिए (जो वास्तव में _access हो सकता है)। – Rob

+0

हां, जैसा कि वहां से बताया गया है। – c0m4

उत्तर

139

उपयोग boost::filesystem:

#include <boost/filesystem.hpp> 

if (!boost::filesystem::exists("myfile.txt")) 
{ 
    std::cout << "Can't find my file!" << std::endl; 
} 
+60

कुछ ऐसा करने के लिए एक बड़ी तीसरी पार्टी लाइब्रेरी स्थापित करने के लिए एक चमकदार लगता है जो * सरल * होना चाहिए – c0m4

+78

बूस्ट एक लाइब्रेरी है जहां अंत में सी ++ मानक पुस्तकालय का हिस्सा बन जाएगा। बढ़ावा देने के साथ जुड़े कई लोग सी ++ मानक से जुड़े लोग हैं। तो बढ़ावा सिर्फ * किसी * तीसरे पक्ष पुस्तकालय नहीं है। यदि आप सी ++ में प्रोग्रामिंग कर रहे हैं तो आपको * इंस्टॉल किया जाना चाहिए! –

+0

मुझे याद है कि b :: fs :: नेटवर्क शेयरों पर मौजूद गैर-मौजूद फ़ाइलों पर "सत्य" मौजूद है: "\\ machine \ share \ this_file_doesnt_exist" => true। पिछली बार मैंने चेक किया था 1.33 को बढ़ावा देने पर, सावधानी बरतें ... – rlerallut

9

अपनी आवश्यकताओं के लिए पर्याप्त क्रॉस-प्लेटफॉर्म होने पर stat() का उपयोग करें। हालांकि यह सी ++ मानक नहीं है, लेकिन पॉज़िक्स।

एमएस विंडोज़ पर _stat, _stat64, _stati64, _wstat, _wstat64, _wstati64 है।

+0

ठीक है, मैं # शामिल क्या करूं? – c0m4

+1

और देखें http://msdn.microsoft.com/en-us/library/14h5k7ff(VS.71).aspx –

+0

अच्छा जवाब +1 ** बूस्ट का उपयोग नहीं कर **, यह एक overkill है के बाद से, हालांकि यह लिखने के लिए तुच्छ नहीं था कि यहां प्रदान की गई चीज़ों से, इसलिए मैंने अभी एक उत्तर पोस्ट किया है। कृपया इसे जाँचें। – gsamaras

7

कैसे के बारे में access?

#include <io.h> 

if (_access(filename, 0) == -1) 
{ 
    // File does not exist 
} 
+0

आईओ है। एच मानक और विंडोज़ पर लिनक्स उपलब्ध है, भले ही यह मानक न हो? – c0m4

+1

एक्सेस() POSIX फ़ंक्शन है जो लिनक्स पर के माध्यम से उपलब्ध है। –

6

मैं यह पता लगाने की कोशिश करूँगा कि फ़ाइल मौजूद है या नहीं। इसके बजाए, आपको इसे उसी मोड में (मानक सी या सी ++ में) खोलने का प्रयास करना चाहिए, जिसका आप इसका उपयोग करना चाहते हैं। क्या उपयोग यह जान रहा है कि फ़ाइल मौजूद है, अगर कहें, तो इसका उपयोग करने की आवश्यकता होने पर यह लिखने योग्य नहीं है?

+0

क्या होगा यदि आप 'ls' जैसी प्रोग्राम लिख रहे हैं? मैं मूल पोस्टर का अनुमान लगा रहा हूं कि फाइल को खोलना नहीं चाहता है। पॉज़िक्स का स्टेट फ़ंक्शन आपको फ़ाइल की अनुमतियों के बारे में जानकारी देना चाहता है, इसलिए यह उस समस्या को ठीक करेगा। – Michael

26

मैं एक खुश बूस्ट उपयोगकर्ता हूं और निश्चित रूप से एंड्रियास समाधान का उपयोग करता हूं। लेकिन आप को बढ़ावा देने libs के लिए उपयोग नहीं किया है, तो आप धारा लाइब्रेरी का उपयोग कर सकते हैं:

ifstream file(argv[1]); 
if (!file) 
{ 
    // Can't open file 
} 

यह काफी नहीं के रूप में अच्छा बढ़ावा :: फाइल सिस्टम के रूप में :: मौजूद है फ़ाइल वास्तव में खोला जाएगा के बाद से ... लेकिन तो यह आमतौर पर अगली चीज़ है जिसे आप वैसे भी करना चाहते हैं।

+14

लेकिन इस कोड के साथ यदि आप फ़ाइल के लिए अनुमति नहीं रखते हैं, तो यह भी खंड में कूद जाएगा, हालांकि यह मौजूद है। ज्यादातर मामलों में इससे कोई फर्क नहीं पड़ता, लेकिन अभी भी उल्लेखनीय है। –

+1

नोटिस किया गया है कि अच्छा() भी सही साबित होता है यदि दिया गया तर्क निर्देशिका को इंगित करता है, तो http://stackoverflow.com/questions/9591036/ifstream-open-doesnt-set-error-bits-when-argument-is-a- निर्देशिका – FelixJongleur42

35

दौड़ की स्थितियों से सावधान रहें: यदि फ़ाइल "मौजूद" चेक और आपके द्वारा खोले जाने वाले समय के बीच गायब हो जाती है, तो आपका प्रोग्राम अप्रत्याशित रूप से विफल हो जाएगा।

फ़ाइल जाना और खोलना बेहतर है, विफलता की जांच करें और यदि सब अच्छा है तो फ़ाइल के साथ कुछ करें। सुरक्षा-महत्वपूर्ण कोड के साथ यह और भी महत्वपूर्ण है।

सुरक्षा और दौड़ की स्थिति के बारे में विवरण: http://www.ibm.com/developerworks/library/l-sprace.html

7

एक और संभावना धारा में good() समारोह का उपयोग करने में शामिल हैं:

#include <fstream>  
bool checkExistence(const char* filename) 
{ 
    ifstream Infield(filename); 
    return Infield.good(); 
} 
+0

'वापस Infield.good()' क्यों नहीं? –

+0

@ RadosławM बेशक आप ऐसा कर सकते हैं कि मैंने बस चित्रण के लिए इस तरह से किया था। – Samer

2

नहीं आवश्यक है, जो एक overkill होगा।


उपयोग stat() (पार नहीं मंच के रूप में पैवन ने उल्लेख किया है, हालांकि), इस तरह:

#include <sys/stat.h> 
#include <iostream> 

// true if file exists 
bool fileExists(const std::string& file) { 
    struct stat buf; 
    return (stat(file.c_str(), &buf) == 0); 
} 

int main() { 
    if(!fileExists("test.txt")) { 
     std::cerr << "test.txt doesn't exist, exiting...\n"; 
     return -1; 
    } 
    return 0; 
} 

आउटपुट:

C02QT2UBFVH6-lm:~ gsamaras$ ls test.txt 
ls: test.txt: No such file or directory 
C02QT2UBFVH6-lm:~ gsamaras$ g++ -Wall main.cpp 
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out 
test.txt doesn't exist, exiting... 

एक और संस्करण (और कहा कि) पाया जा सकता है here

+0

श्रीमान/श्रीमती डाउनवॉटर, अगर आपको लगता है कि यह उत्तर सुधार किया जा सकता है, तो कृपया कहें कि कैसे! :) – gsamaras

+0

डाउनवॉटर नहीं, लेकिन सवाल ने क्रॉस-प्लेटफ़ॉर्म समाधान के लिए कहा, और सभी प्लेटफ़ॉर्म पर स्टेट मौजूद नहीं है। – pavon

+0

ओह यह सही है @ पैवन, धन्यवाद! – gsamaras

संबंधित मुद्दे

 संबंधित मुद्दे