2008-11-30 15 views
5

यदि फ़ाइल एक नियमित फ़ाइल है (और निर्देशिका नहीं है, एक पाइप, आदि) तो मैं सी ++ में कैसे जांचूं? मुझे फ़ंक्शन की आवश्यकता है फ़ाइल()।मैं कैसे जांचूं कि फ़ाइल C++ में एक नियमित फ़ाइल है या नहीं?

DIR *dp; 
struct dirent *dirp; 

while ((dirp = readdir(dp)) != NULL) { 
if (isFile(dirp)) { 
    cout << "IS A FILE!" << endl; 
i++; 
} 

मैं साथ (अहस्ताक्षरित चार) 0x8 dirp- की तुलना की है की कोशिश की> d_type, लेकिन यह विभिन्न प्रणालियों के माध्यम से पोर्टेबल नहीं लगता है।

उत्तर

3

आपको फ़ाइल पर स्टेट (2) कॉल करने की आवश्यकता है, और फिर st_mode पर S_ISREG मैक्रो का उपयोग करें।

3

सी ++ स्वयं फ़ाइल सिस्टम से निपटता नहीं है, इसलिए भाषा में कोई पोर्टेबल तरीका नहीं है। प्लेटफ़ॉर्म-विशिष्ट उदाहरण stat * निक्स के लिए हैं (जैसा कि पहले से ही मार्टिन बनाम लोविस द्वारा नोट किया गया है) और GetFileAttributes विंडोज के लिए हैं।

इसके अलावा, यदि आप Boost पर एलर्जी नहीं हैं, तो काफी क्रॉस-प्लेटफ़ॉर्म boost::filesystem है।

23

आप पोर्टेबल boost::filesystem (मानक सी ++ पुस्तकालय इस सी ++ 17 में std::filesystem की हाल ही में शुरू करने तक ऊपर नहीं कर सकते थे) का उपयोग कर सकते हैं:

#include <boost/filesystem/path.hpp> 
#include <boost/filesystem/operations.hpp> 
#include <iostream> 

int main() { 
    using namespace boost::filesystem; 

    path p("/bin/bash"); 
    if(is_regular_file(p)) { 
     std::cout << "exists and is regular file" << std::endl; 
    } 
} 
0

आप सभी की मदद के लिए धन्यवाद, मैं है

while ((dirp = readdir(dp)) != NULL) { 
    if (!S_ISDIR(dirp->d_type)) { 
     ... 
     i++; 
    } 
} 

और यह ठीक काम करता है। =)

0
#include <boost/filesystem.hpp> 

bool isFile(std::string filepath) 
{ 
    boost::filesystem::path p(filepath); 
    if(boost::filesystem::is_regular_file(p)) { 
     return true; 
    } 
    std::cout<<filepath<<" file does not exist and is not a regular file"<<std::endl; 
    return false; 
} 
1

सी ++ 17 में, आप std :: फाइल सिस्टम का उपयोग कर सकते :: is_regular_file

#include <filesystem> // additional include 

if(std::filesystem::is_regular_file(yourFilePathToCheck)) 
    ; //Do what you need to do 

ध्यान दें कि सी ++ के पुराने संस्करण एसटीडी के तहत यह हो सकता था :: प्रयोगात्मक :: फाइल सिस्टम (स्रोत: http://en.cppreference.com/w/cpp/filesystem/is_regular_file)

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