हम्म, मुझे लगता है कि मैं प्रश्न को गलत समझता हूं लेकिन मैं इसे जोखिम में डालने वाला हूं। निम्नलिखित सीधी विधि में क्या गलत है?
public static void CopyFilesRecursively(DirectoryInfo source, DirectoryInfo target) {
foreach (DirectoryInfo dir in source.GetDirectories())
CopyFilesRecursively(dir, target.CreateSubdirectory(dir.Name));
foreach (FileInfo file in source.GetFiles())
file.CopyTo(Path.Combine(target.FullName, file.Name));
}
EDIT चूंकि इस पोस्टिंग ने समान रूप से सरल प्रश्न के इतने सरल उत्तर के लिए एक प्रभावशाली संख्या में डाउनवॉट किया है, मुझे एक स्पष्टीकरण जोड़ना चाहिए। कृपया नीचे पढ़ने से पहले इसे पढ़ें ।
सबसे पहले, यह कोड प्रश्न में कोड को बदलने के लिए ड्रॉप-इन के रूप में इरादा नहीं है । यह केवल दृष्टांत प्रयोजन के लिए है।
Microsoft.VisualBasic.Devices.Computer.FileSystem.CopyDirectory
कुछ अतिरिक्त शुद्धता परीक्षण करता है (जैसे कि क्या स्रोत और लक्ष्य वैध निर्देशिका हैं, क्या स्रोत लक्ष्य का जनक है आदि) जो इस उत्तर से गायब हैं। वह कोड शायद अधिक अनुकूलित भी है।
उस ने कहा, कोड अच्छी तरह से काम करता है । यह है (लगभग हूबहू) साल के लिए एक परिपक्व सॉफ्टवेयर में इस्तेमाल किया गया। सभी आईओ हैंडलिंग के साथ मौजूद अंतर्निहित चंचलता के अलावा (जैसे कि क्या होता है यदि उपयोगकर्ता मैन्युअल रूप से यूएसबी ड्राइव को अनप्लग कर देता है जबकि आपका कोड इसे लिख रहा है?), कोई ज्ञात समस्या नहीं है।
विशेष रूप से, मैं यह बताना चाहता हूं कि यहाँ पुनरावृत्ति का उपयोग बिल्कुल समस्या नहीं है। न तो सिद्धांत में (वैचारिक रूप से, यह सबसे सुरुचिपूर्ण समाधान है) और न ही व्यवहार में: यह कोड स्टैक को अतिप्रवाह नहीं करेगा । स्टैक काफी बड़ा है, यहां तक कि गहरी नेस्टेड फ़ाइल पदानुक्रमों को संभालने के लिए। स्टैक स्पेस की समस्या बनने से बहुत पहले, फ़ोल्डर पथ की लंबाई सीमा में किक हो जाती है।
ध्यान दें कि एक दुर्भावनापूर्ण उपयोगकर्ता एक -एक अक्षर के गहरे-नेस्टेड निर्देशिकाओं का उपयोग करके इस धारणा को तोड़ने में सक्षम हो सकता है। मैंने यह कोशिश नहीं की है। लेकिन बस इस बिंदु को स्पष्ट करने के लिए: इस कोड को एक विशिष्ट कंप्यूटर पर अतिप्रवाह करने के लिए, निर्देशिकाओं को कुछ हज़ार बार नेस्टेड करना होगा । यह बस एक यथार्थवादी परिदृश्य नहीं है।