Go में निर्देशिका सूचीकरण: सरल से जटिल तक
\n\nफ़ाइल सिस्टम के साथ कार्य करना किसी भी प्रोग्रामिंग भाषा के मूलभूत कार्यों में से एक है। Go में इसे इतनी खूबसूरती से लागू किया गया है कि Go में निर्देशिका सूची (list directory in Go) जैसा सामान्य कार्य भी एक रोमांचक अनुभव बन जाता है। यदि आपने कभी सोचा है: "मैं Go में किसी फ़ोल्डर की फ़ाइलों की सूची कैसे प्राप्त करूं?" तो आप सही जगह पर हैं। आज हम सरल आउटपुट से लेकर फ़िल्टरिंग के साथ रिकर्सिव ट्रैवर्सल तक, सभी संभावित तरीकों पर चर्चा करेंगे।
\n\nयह विषय Stack Overflow पर इतना लोकप्रिय क्यों है? क्योंकि Go एक साथ कई दृष्टिकोण प्रदान करता है, और सही चुनना आधी सफलता है। हम क्लासिक os.ReadDir, पुराने ioutil.ReadDir (लेकिन यह अभी भी पुराने प्रोजेक्ट्स में देखा जा सकता है), और रिकर्सिव ट्रैवर्सल के लिए शक्तिशाली filepath.Walk पर विचार करेंगे। चलिए शुरू करते हैं!
1. सबसे सरल सूचीकरण: os.ReadDir
\n\nGo 1.16 से शुरू करते हुए, os पैकेज को एक नई विधि ReadDir मिली, जो डी-फैक्टो मानक बन गई है। यह os.DirEntry ऑब्जेक्ट्स का एक स्लाइस लौटाता है - फ़ाइलों और फ़ोल्डरों का हल्का विवरण। यह इस प्रकार दिखता है:
package main\n\nimport (\n "fmt"\n "os"\n "log"\n)\n\nfunc main() {\n // वर्तमान निर्देशिका की सामग्री पढ़ें\n entries, err := os.ReadDir(".")\n if err != nil {\n log.Fatal(err)\n }\n\n fmt.Println("वर्तमान फ़ोल्डर की सामग्री:")\n for _, entry := range entries {\n fmt.Printf("- %s (निर्देशिका: %v)\\n", entry.Name(), entry.IsDir())\n }\n}\n\n\nयह कोड वर्तमान निर्देशिका में सभी फ़ाइलों और फ़ोल्डरों को प्रदर्शित करेगा। ध्यान दें: os.ReadDir उप-फ़ोल्डर नहीं पढ़ता - केवल पहला स्तर। यदि आपको रिकर्सिव रूप से Go में निर्देशिका सूची (list directory in Go) चाहिए, तो आगे पढ़ें।
2. ioutil.ReadDir: पुराना, लेकिन परिचित
\n\nGo संस्करण 1.16 से पहले, सभी ioutil.ReadDir का उपयोग करते थे। यह []os.FileInfo लौटाता है - फ़ाइल के बारे में पूरी जानकारी (आकार, अनुमतियाँ, संशोधन समय) वाली एक भारी संरचना। हालाँकि इस विधि को deprecated चिह्नित किया गया है, फिर भी आप इसे लीगेसी कोड में देख सकते हैं:
package main\n\nimport (\n "fmt"\n "io/ioutil"\n "log"\n)\n\nfunc main() {\n files, err := ioutil.ReadDir("./mydir")\n if err != nil {\n log.Fatal(err)\n }\n\n fmt.Println("mydir में फ़ाइलें (पुराना तरीका):")\n for _, file := range files {\n fmt.Printf("नाम: %s, आकार: %d बाइट\\n", file.Name(), file.Size())\n }\n}\n\n\nमुख्य अंतर: ioutil.ReadDir परिणाम को फ़ाइल नाम के अनुसार क्रमबद्ध करता है (ls की तरह), जबकि os.ReadDir नहीं करता। यदि क्रम महत्वपूर्ण है, तो sort.Slice या मैन्युअल सॉर्टिंग का उपयोग करें।
3. filepath.Walk के साथ रिकर्सिव ट्रैवर्सल
\n\nजब सभी उप-फ़ोल्डरों में जाने की आवश्यकता हो, तो filepath.Walk मदद करता है। यह फ़ंक्शन निर्देशिका ट्री को ट्रैवर्स करता है, प्रत्येक पाए गए आइटम के लिए कॉलबैक को कॉल करता है। बैकअप, फ़ाइल खोज या प्रोजेक्ट संरचना विश्लेषण के लिए आदर्श:
package main\n\nimport (\n "fmt"\n "os"\n "path/filepath"\n)\n\nfunc main() {\n root := "./myproject"\n err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {\n if err != nil {\n return err\n }\n fmt.Printf("मिला: %s (आकार: %d)\\n", path, info.Size())\n return nil\n })\n if err != nil {\n fmt.Println("ट्रैवर्सल त्रुटि:", err)\n }\n}\n\n\nएक महत्वपूर्ण बारीकी: filepath.Walk सिमलिंक का अनुसरण करता है और यदि चक्रीय संदर्भ हैं तो अनंत लूप में जा सकता है। प्रोडक्शन के लिए filepath.WalkDir (Go 1.16+) का उपयोग करें - यह हल्का और सुरक्षित है।
4. फ़िल्टरिंग: केवल .go फ़ाइलें या केवल फ़ोल्डर
\n\nअक्सर सब कुछ नहीं, बल्कि केवल विशिष्ट प्रकार की फ़ाइलें प्राप्त करने की आवश्यकता होती है। आइए strings.HasSuffix और IsDir() जाँच का उपयोग करके फ़िल्टरिंग लागू करें।