आपको C++ में फ़ाइलों की सूची की आवश्यकता क्यों हो सकती है?
\n\nकल्पना करें: आप एक प्रोग्राम लिख रहे हैं जिसे सैकड़ों लॉग को प्रोसेस करना है, कॉन्फ़िगरेशन फ़ाइलों की उपस्थिति की जाँच करनी है, या बस उपयोगकर्ता को दिखाना है कि फ़ोल्डर में क्या है। निर्देशिका के अंदर "झाँकने" की क्षमता के बिना, आप एक दीवार से टकरा जाते हैं। यही कारण है कि प्रश्न "How can I get the list of files in a directory using C or C++?" Stack Overflow पर सबसे लोकप्रिय में से एक है। और आज हम इसे शुरू से अंत तक समझेंगे।
\n\nलेख में मैं तीन मुख्य तरीके दिखाऊंगा: क्लासिक C-शैली (हर जगह काम करता है, लेकिन सावधानी की आवश्यकता है) से लेकर आधुनिक C++17 std::filesystem (संक्षिप्त, सुरक्षित और सुंदर) तक। आप सीखेंगे कि अपने कार्य के लिए सही उपकरण कैसे चुनें, और तैयार कोड उदाहरण प्राप्त करेंगे जिन्हें आप तुरंत अपने प्रोजेक्ट में डाल सकते हैं।
तरीका 1: क्लासिक — dirent.h (POSIX / Linux / macOS)
\n\nयह विधि सभी समाधानों का "दादा" है। इसका उपयोग Unix-जैसी प्रणालियों पर C और C++ में किया जाता है। सार सरल है: आप निर्देशिका खोलते हैं, एक-एक करके प्रविष्टियाँ पढ़ते हैं, बंद करते हैं। कोई तामझाम नहीं, लेकिन पूर्ण नियंत्रण।
\n\nसमावेशन और संरचनाएँ
\nआपको आवश्यकता होगी:
\n- \n
#include <dirent.h>— निर्देशिकाओं के साथ काम करना \n DIR *dir— निर्देशिका स्ट्रीम के लिए पॉइंटर \n struct dirent *entry— संरचना जिसमें फ़ाइल का नाम होता है \n
कोड उदाहरण: सभी नामों का सरल आउटपुट
\n#include <iostream>\n#include <dirent.h>\n\nint main() {\n const char* path = "."; // वर्तमान फ़ोल्डर\n DIR* dir = opendir(path);\n if (dir == nullptr) {\n std::cerr << "निर्देशिका खोलने में विफल: " << path << std::endl;\n return 1;\n }\n\n struct dirent* entry;\n while ((entry = readdir(dir)) != nullptr) {\n std::cout << entry->d_name << std::endl;\n }\n\n closedir(dir);\n return 0;\n}\n\nमहत्वपूर्ण बारीकियाँ
\n- \n
- फ़ंक्शन
readdir()नाम.(वर्तमान निर्देशिका) और..(पैरेंट निर्देशिका) लौटाता है। आमतौर पर इन्हें छोड़ना होता है: \n
if (entry->d_name[0] == '.') continue;\n- \n
- यह कोड **डिफ़ॉल्ट रूप से Windows पर काम नहीं करता**। Windows के लिए
windows.hऔरFindFirstFile/FindNextFileहै (इसके बारे में बाद में)। \n - लाभ: न्यूनतमता, C++17 के बिना काम करता है। नुकसान: क्रॉस-प्लेटफ़ॉर्म नहीं, फ़ाइल प्रकार के अनुसार कोई फ़िल्टरिंग नहीं। \n
तरीका 2: Windows API — FindFirstFile और FindNextFile
\n\nयदि आपका लक्ष्य Windows है, तो dirent.h को भूल जाएँ। इसके बजाय मूल WinAPI का उपयोग करें। यह शक्तिशाली है, लेकिन कोड लंबा हो जाता है।
यह कैसे काम करता है
\n- \n
- आप एक पैटर्न के साथ
FindFirstFileको कॉल करते हैं (उदाहरण के लिए,"C:\\\\*")। \n - आपको एक हैंडल और पहली प्रविष्टि मिलती है। \n
- लूप में
FindNextFileको कॉल करें जब तक यह 0 न लौटाए। \n FindCloseके माध्यम से हैंडल बंद करें। \n
उदाहरण: ड्राइव C: के रूट में फ़ाइलों की सूची
\n#include <iostream>\n#include <windows.h>\n\nint main() {\n WIN32_FIND_DATA findFileData;\n HANDLE hFind = FindFirstFile("C:\\\\*", &findFileData);\n\n if (hFind == INVALID_HANDLE_VALUE) {\n std::cerr << "फ़ाइलें खोजने में विफल (त्रुटि कोड: " << GetLastError() << ")" << std::endl;\n return 1;\n }\n\n do {\n // "." और ".." को छोड़ें\n if (strcmp(findFileData.cFileName, ".") != 0 && strcmp(findFileData.cFileName, "..") != 0) {\n std::cout << findFileData.cFileName << std::endl;\n }\n } while (FindNextFile(hFind, &findFileData) != 0);\n\n FindClose(hFind);\n return 0;\n}\n\nक्या जानना महत्वपूर्ण है
\n- \n
WIN32_FIND_DATAमेंdwFileAttributesफ़ील्ड है