तकनीकी व्याख्या
अधिकांश तरीकों की वजह से समस्याएं पैदा हो रही हैं, यह है कि विंडोज़ फाइलों और फ़ोल्डरों को एन्यूमरेट करने की कोशिश करती है। यह कुछ सौ - या हजार तक की फ़ाइलों के साथ बहुत अधिक समस्या नहीं है - कुछ स्तरों पर फ़ाइलें / फ़ोल्डर गहरे, लेकिन जब आपके पास लाखों फ़ोल्डरों में लाखों- अरबों फाइलें हैं, जो दर्जनों स्तरों पर गहरी हो रही हैं, तो यह निश्चित रूप से सिस्टम को बंद कर देगा ।
मान लें कि आपके पास "केवल" 100,000,000 फाइलें हैं, और विंडोज एक सरल संरचना का उपयोग करता है जैसे कि प्रत्येक फ़ाइल को अपने पथ के साथ संग्रहीत करने के लिए (इस तरह आप प्रत्येक निर्देशिका को अलग से संग्रहीत करने से बचते हैं, इस प्रकार कुछ ओवरहेड को बचाते हैं):
struct FILELIST { // Total size is 264 to 528 bytes:
TCHAR name[MAX_PATH]; // MAX_PATH=260; TCHAR=1 or 2 bytes
FILELIST* nextfile; // Pointers are 4 bytes for 32-bit and 8 for 64-bit
}
इस पर निर्भर करता है कि यह 8-बिट वर्णों या यूनिकोड वर्णों का उपयोग करता है (यह यूनिकोड का उपयोग करता है) और क्या आपका सिस्टम 32-बिट या 64-बिट है, तो सूची को संग्रहीत करने के लिए इसे 25GB और 49GB मेमोरी के बीच की आवश्यकता होगी (और यह बहुत ही महत्वपूर्ण है) सरलीकृत संरचना)।
जिस कारण से Windows फ़ाइलों और फ़ोल्डरों को हटाने से पहले उन्हें हटाने की कोशिश करता है, उसे हटाने के लिए आपके द्वारा उपयोग किए जा रहे तरीके के आधार पर भिन्नता होती है, लेकिन एक्सप्लोरर और कमांड-दुभाषिया दोनों इसे करते हैं (आप कमांड शुरू करने पर देरी देख सकते हैं)। आप डिस्क गतिविधि (HDD LED) फ्लैश भी देख सकते हैं क्योंकि यह ड्राइव से डायरेक्टरी ट्री को पढ़ता है।
समाधान
इस तरह की स्थिति से निपटने के लिए आपकी सबसे अच्छी शर्त एक डिलीट टूल का उपयोग करना है जो एक बार में एक, एक के बाद एक फाइल और फ़ोल्डर्स को डिलीट करता है। मुझे नहीं पता कि क्या करने के लिए कोई तैयार उपकरण हैं, लेकिन यह एक साधारण बैच-फ़ाइल के साथ पूरा करना संभव है।
@echo off
if not [%1]==[] cd /d %1
del /q *
for /d %%i in (*) do call %0 "%%i"
यदि कोई तर्क पारित किया गया था, तो यह जांचने के लिए क्या है। यदि ऐसा है, तो यह निर्दिष्ट निर्देशिका में बदल जाता है (आप इसे चालू निर्देशिका में शुरू करने के लिए एक तर्क के बिना चला सकते हैं या एक निर्देशिका निर्दिष्ट कर सकते हैं - यहां तक कि इसे शुरू करने के लिए एक अलग ड्राइव पर भी)।
इसके बाद, यह वर्तमान निर्देशिका की सभी फ़ाइलों को हटा देता है। इस मोड में, यह किसी भी चीज़ को एन्यूमरेट नहीं करना चाहिए और बस फ़ाइलों को बिना ज़्यादा सोचे, यदि कोई हो, तो उसे हटा दें।
फिर यह वर्तमान निर्देशिका में फ़ोल्डरों की गणना करता है और खुद को कॉल करता है, प्रत्येक फ़ोल्डर को नीचे की ओर फिर से भरने के लिए इसे (स्वयं) पास करता है।
विश्लेषण
इसका कारण यह है कि यह काम करना चाहिए क्योंकि यह पूरे पेड़ में हर एक फाइल और फोल्डर की गणना नहीं करता है । यह किसी भी फाइल को एन्यूमरेट नहीं करता है, और केवल फ़ोल्डर को मौजूदा डायरेक्टरी ( मूल माता-पिता में शेष ) को शामिल करता है। मान लें कि किसी भी फ़ोल्डर में केवल कुछ सौ उप-निर्देशिकाएं हैं, तो यह बहुत बुरा नहीं होना चाहिए, और निश्चित रूप से अन्य तरीकों की तुलना में बहुत कम स्मृति की आवश्यकता होती है जो पूरे पेड़ को घेर लेती है।
आप /r
(मैन्युअल) पुनरावर्तन का उपयोग करने के बजाय स्विच का उपयोग करने के बारे में सोच सकते हैं । यह काम नहीं करेगा क्योंकि जब /r
स्विच पुनरावृत्ति करता है, तो यह पूरी निर्देशिका ट्री को पूर्व-संधारित करता है जो कि वास्तव में हम बचना चाहते हैं; हम बिना ट्रैक रखे ही हटाना चाहते हैं।
तुलना
इस पद्धति की तुलना पूर्ण-गणना विधि (ओं) से करें।
आपने कहा था कि आपके पास "लाखों निर्देशिकाएं" थीं; मान लीजिए 100 मिलियन। यदि पेड़ लगभग संतुलित है, और प्रति फ़ोल्डर लगभग 100 उप-निर्देशिकाओं का औसत मान रहा है, तो सबसे गहरी नेस्टेड निर्देशिका लगभग चार स्तर नीचे होगी - वास्तव में, पूरे पेड़ में 101,010,100 उप-फ़ोल्डर होंगे। (यह देखते हुए कि कैसे 100M सिर्फ 100 और 4. तक टूट सकता है)
चूंकि हम फ़ाइलों की गणना नहीं कर रहे हैं, हमें केवल 4 × 100 = 400
किसी भी समय अधिकतम निर्देशिकाओं के लिए अधिकतम 100 निर्देशिका नामों पर नज़र रखने की आवश्यकता है ।
इसलिए मेमोरी की आवश्यकता ~ 206.25KB होनी चाहिए, जो किसी भी आधुनिक (या अन्यथा) प्रणाली की सीमा के भीतर है।
परीक्षा
दुर्भाग्य से (?) मेरे पास लाखों फ़ोल्डरों में ट्रिलियन फ़ाइलों वाली प्रणाली नहीं है, इसलिए मैं इसका परीक्षण करने में सक्षम नहीं हूं (मुझे विश्वास है कि अंतिम गणना में, मेरे पास लगभग ~ 800K फाइलें थीं), इसलिए किसी और को कोशिश करनी होगी यह।
चेतावनी
बेशक स्मृति केवल सीमा नहीं है। ड्राइव एक बड़ी अड़चन होगी क्योंकि आपके द्वारा डिलीट की जाने वाली हर फाइल और फोल्डर के लिए सिस्टम को इसे मुफ्त में चिह्नित करना होगा। शुक्र है कि इनमें से कई डिस्क ऑपरेशंस को एक साथ (कैश्ड) बंडल किया जाएगा और व्यक्तिगत रूप से (हार्ड-ड्राइव के लिए कम से कम, रिमूवेबल मीडिया के लिए नहीं) के बजाय विखंडू में लिखा जाएगा, लेकिन यह अभी भी काफी जोर देगा क्योंकि सिस्टम पढ़ता है और डेटा लिखता है।