2009-03-04 12 views
14

से फ़ाइल नाम पढ़ें वहाँ सी में एक आसान तरीका ++ कई फ़ाइलों वाला कोई फ़ोल्डर से फ़ाइल नाम के एक नंबर को पढ़ने के लिए अगर मैं सोच रहा था। यदि कोई सोच रहा है तो वे सभी बिटमैप हैं।एक निर्देशिका

मैं खिड़कियों प्रोग्रामिंग तो मुझे उम्मीद थी यह सरल सी ++ तरीकों का उपयोग कर किया जा सकता है के बारे में ज्यादा पता नहीं है।

+1

भी देखें [मैं कैसे सूची प्राप्त कर सकते सी या सी ++ का उपयोग कर निर्देशिका में फ़ाइलों का (] http://stackoverflow.com/questions/612,097/कैसे-कर सकते हैं-ए-मिल-सूची के- फ़ाइलों में एक-निर्देशिका का उपयोग-सी या ग)। –

उत्तर

18

बूस्ट एक basic_directory_iterator जो एक सी ++ मानक इनपुट इटरेटर जो निर्देशिका की सामग्री तक पहुँचता अनुरूप प्रदान करता है प्रदान करता है। यदि आप बूस्ट का उपयोग कर सकते हैं, तो यह कम से कम क्रॉस-प्लेटफ़ॉर्म कोड है।

12

मैं तुम्हें FindFirstFile() और FindNextFile() लिए देख रहे हैं लगता है।

+1

नोट नीचे: वे फ़ंक्शंस माइक्रोसॉफ्ट एपीआई का हिस्सा हैं, सी ++ मानक का हिस्सा नहीं। – Twonky

4

मैं सुझाव है कि आप देशी Win32 FindFirstFile() और FindNextFile() कार्यों का उपयोग कर सकते हैं। ये आपको फाइलों की खोज के तरीके पर पूर्ण नियंत्रण देते हैं। यह सरल सी एपीआई हैं और उपयोग करने में मुश्किल नहीं हैं।

एक और फायदा यह है कि Win32 त्रुटियां छिपी नहीं हैं या सी/सी ++ लाइब्रेरी परत के कारण प्राप्त करने के लिए कठिन बना रही हैं।

6

तुम भी POSIX opendir() और readdir() फ़ंक्शन का उपयोग कर सकते हैं। this manual page जो भी कुछ महान उदाहरण कोड है देखें।

9

बस मेरी स्निपेट निर्देशिका में एक त्वरित रूप से देखा गया था। यह पाया गया:

vector<CStdString> filenames; 
CStdString directoryPath("C:\\foo\\bar\\baz\\*"); 

WIN32_FIND_DATA FindFileData; 
HANDLE hFind = FindFirstFile(directoryPath, &FindFileData); 

if (hFind != INVALID_HANDLE_VALUE) 
{ 
    do 
    { 
     if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) 
       filenames.push_back(FindFileData.cFileName); 
    } while (FindNextFile(hFind, &FindFileData)); 

    FindClose(hFind); 
} 

यह आपको निर्देशिका में सभी फ़ाइल नामों के साथ एक वेक्टर देता है। यह केवल विंडोज़ पर काम करता है।


João Augusto एक answer में टिप्पणी की थी

मत भूलना के लिए FindClose(hFind) के बाद जांच करने के लिए:

DWORD dwError = GetLastError(); 
if (dwError != ERROR_NO_MORE_FILES) 
{ 
    // Error happened   
} 

यह स्कैनिंग अगर एक नेटवर्क पर विशेष रूप से महत्वपूर्ण है।

1

एक अन्य विकल्प है -

  1. system("dir | findstr \".bmp\" > temp.txt ");
  2. अब सभी फ़ाइल नाम पाने के लिए लाइन द्वारा temp.txt लाइन पढ़ें।
1

glob() का उपयोग क्यों नहीं करें?

glob_t glob_result; 
glob("/foo/bar/*",GLOB_TILDE,NULL,&glob_result); 
for(unsigned int i=0;i<glob_result.gl_pathc;++i){ 
    cout << glob_result.gl_pathv[i] << endl; 
} 
+0

आप यह जांचना भूल गए कि ग्लोब() शून्य लौटाता है, साथ ही ग्लोबफ्री() के साथ आवंटित glob_result को मुक्त करता है। – orbitcowboy

2

सी ++ 17 एक मानक प्राप्त के रास्ते भी शामिल है कि

http://en.cppreference.com/w/cpp/filesystem/directory_iterator

#include <fstream> 
#include <iostream> 
#include <filesystem> 
namespace fs = std::filesystem; 

int main() 
{ 
    fs::create_directories("sandbox/a/b"); 
    std::ofstream("sandbox/file1.txt"); 
    std::ofstream("sandbox/file2.txt"); 
    for(auto& p: fs::directory_iterator("sandbox")) 
     std::cout << p << '\n'; 
    fs::remove_all("sandbox"); 
} 

संभावित उत्पादन:

sandbox/a 
sandbox/file1.txt 
sandbox/file2.txt 
संबंधित मुद्दे