यदि C ++ में कोई फ़ाइल मौजूद है, तो यह जांचने का सबसे अच्छा तरीका क्या है? (क्रॉस प्लेटफॉर्म)


97

मैंने इस बात के उत्तर पढ़ लिए हैं कि क्या कोई फ़ाइल C में मौजूद है या नहीं? (क्रॉस प्लेटफ़ॉर्म) , लेकिन मैं सोच रहा हूं कि क्या मानक सी ++ लिबास का उपयोग करने का एक बेहतर तरीका है? अधिमानतः फ़ाइल खोलने की कोशिश किए बिना।

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


पहुँच के लिए <io.h> (जो वास्तव में _access हो सकता है)।
रॉब

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

जवाबों:


170

बूस्ट का उपयोग करें :: फाइल सिस्टम :

#include <boost/filesystem.hpp>

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

68
लगता है कि एक बड़ी थर्ड पार्टी लाइब्रेरी को स्थापित करने के लिए थोड़ा सा
फेरबदल

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

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

यदि आपका कंपाइलर tr1 कार्यान्वयन के साथ आता है, तो आपको Boost को स्थापित करने की आवश्यकता नहीं है। यह std :: tr1 :: filesystem
Nemanja Trifunovic

1
वास्तव में ASFAIK ने TR1 नहीं बनाया, लेकिन बाद के चरण में जोड़ा जाएगा। मुझे आधिकारिक TR1 ड्राफ्ट में भी इसका कोई संदर्भ नहीं मिला: open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf
एंड्रियास

41

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

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

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


30

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

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

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


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

1
यह देखते हुए कि अच्छा () भी सही है अगर दी गई दलील एक निर्देशिका को दर्शाती है, तो stackoverflow.com/questions/9591036/…
FelixJongleur42

12

स्टेट () का उपयोग करें, यदि यह आपकी आवश्यकताओं के लिए पर्याप्त पार मंच है। यह C ++ मानक नहीं है, लेकिन POSIX है।

MS Windows पर _stat, _stat64, _stati64, _wstat, _wstat64, _wstati64 है।


1
<sys / types.h> और <sys / stat.h> देखें msdn.microsoft.com/en-us/library/14h5k7ff(VS.71).aspx
activout.se

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

9

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

#include <io.h>

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

Io.h सामान्य है, भले ही यह मानक नहीं है?
c0m4

1
एक्सेस () POSIX फ़ंक्शन है जो लिनक्स पर <unistd.h> के माध्यम से उपलब्ध है।
एलेक्स बी

9

good()स्ट्रीम में फ़ंक्शन का उपयोग करने की एक और संभावना है:

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

7

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


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

6

यदि आपका कंपाइलर C ++ 17 का समर्थन करता है, तो आपको बूस्ट की आवश्यकता नहीं है, आप बस उपयोग कर सकते हैं std::filesystem::exists

#include <iostream> // only for std::cout
#include <filesystem>

if (!std::filesystem::exists("myfile.txt"))
{
    std::cout << "File not found!" << std::endl;
}

3

नहीं आवश्यक है , जो एक ओवरकिल होगा


स्टेट का उपयोग करें () (क्रॉस प्लेटफॉर्म नहीं है, जैसा कि पावन ने उल्लेख किया है), इस तरह:

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

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


डाउनवॉटर नहीं, लेकिन क्रॉस प्लेटफॉर्म समाधान के लिए पूछे गए प्रश्न और सभी प्लेटफार्मों पर स्टेट मौजूद नहीं है।
पावन

0

यदि आप पहले से ही इनपुट फ़ाइल स्ट्रीम क्लास ( ifstream) का उपयोग कर रहे हैं , तो आप इसके फ़ंक्शन का उपयोग कर सकते हैं fail()

उदाहरण:

ifstream myFile;

myFile.open("file.txt");

// Check for errors
if (myFile.fail()) {
    cerr << "Error: File could not be found";
    exit(1);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.