2012-09-13 11 views
24

मेरे ऐप में, मैंने एक सिस्टम बनाया है जहां उपयोगकर्ता चित्र गैलरी बना सकते हैं। डिस्क पर श्रेणी_नाम/गैलरी_नाम/{चित्र} के प्रारूप में फ़ोल्डर में आयोजित तस्वीरें। प्रत्येक अपलोड की गई तस्वीर को ऊपर दी गई प्रासंगिक निर्देशिका संरचना के तहत संग्रहीत किया जाता है।"निर्देशिका खाली नहीं है" त्रुटि प्रोग्राम को प्रोग्रामेटिक रूप से हटाने की कोशिश करते समय

हालांकि किसी श्रेणी को हटाने की कोशिश करते समय, साथ ही डेटाबेस से हटाना, मैं सिस्टम से प्रासंगिक फ़ोल्डरों को भी हटाना चाहता हूं। जब मैं पहली बार त्रुटि संदेश प्राप्त हुआ "निर्देशिका खाली नहीं है" मैं searched and found इस समाधान:

public static void DeleteDirectory(string target_dir) 
    { 
     string[] files = Directory.GetFiles(target_dir); 
     string[] dirs = Directory.GetDirectories(target_dir); 

     foreach (string file in files) 
     { 
      File.SetAttributes(file, FileAttributes.Normal); 
      File.Delete(file); 
     } 

     foreach (string dir in dirs) 
     { 
      DeleteDirectory(dir); 
     } 

     Directory.Delete(target_dir, false); 
    } 
इस समाधान के साथ

, "GALLERY_NAME" फ़ोल्डर में तस्वीरें ठीक नष्ट कर दिया जाता है, तो GALLERY_NAME फ़ोल्डर को स्वयं को नष्ट कर दिया जाता है ठीक। इसलिए अब हम एक खाली श्रेणी_नाम फ़ोल्डर के साथ छोड़ दिए गए हैं। फिर उपरोक्त subroutine (Directory.Delete(target_dir, false);) में कोड का अंतिम बिट श्रेणी_नाम फ़ोल्डर को हटाने के लिए बुलाया जाता है। त्रुटि फिर से बढ़ती है ..

क्या कोई इसका समाधान जानता है?

  1. Directory.Delete(target_dir, true); काम नहीं किया, इसलिए मैंने एक विकल्प की कोशिश की।
  2. मेरे पास मूल फ़ोल्डर पर पूर्ण नियंत्रण है और श्रेणी_नाम और गैलरी_नाम फ़ोल्डरों को बिना किसी समस्या के प्रोग्रामेटिक रूप से बनाया गया है।
  3. जैसा कि मैंने उल्लेख किया है, उप निर्देशिका (गैलरी_नाम फ़ोल्डर्स) और उनकी सामग्री (फोटो) इस कोड के साथ ठीक है हटा दी गई है। यह श्रेणी_नाम फ़ोल्डर है जो त्रुटि का कारण बनता है, भले ही इस कोड के बाद, यह केवल एक खाली फ़ोल्डर है।

अपवाद संदेश मैं मिलता है:

System.IO.IOException was unhandled by user code 
    HResult=-2147024751 
    Message=The directory is not empty. 

    Source=mscorlib 
    StackTrace: 
     at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
     at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound) 
     at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost) 
     at System.IO.Directory.Delete(String path) 
     at MyApp.PhotoGallery.Categories.deleteCategory(Int32 cID, String categoryname) in d:\Documents\My Dropbox\web projects\MyAppFolder\App_Code\BLL\PhotoGallery.vb:line 291 
     at _admhades_PhotoGallery.deleteCategory(Int32 categoryID, String categoryname) in d:\Documents\My Dropbox\web projects\HavadisPre\_admhades\PhotoGallery.aspx.vb:line 71 
+0

आपकी फ़ोल्डर अनुमतियां क्या हैं? – northpole

+0

मेरे पास पूर्ण नियंत्रण है .. एक साइड नोट के रूप में, फ़ोल्डर्स प्रोग्रामेटिक रूप से भी बनाए जाते हैं .. –

+0

मुझे लगता है कि आप उपरोक्त को http://stackoverflow.com/questions/329355/cannot-delete-directory-with- निर्देशिका- deletepath-true - क्या आप सुनिश्चित हैं कि फ़ोल्डर विंडोज एक्सप्लोरर में खुला नहीं है, उदाहरण के लिए अन्य उत्तरों के अनुसार? क्या फ़ोल्डर में कुछ और अभी भी लॉक हो सकता है? – dash

उत्तर

34

तुम बस Directory.Delete(target_dir, true); का उपयोग कर सकते रिकर्सिवली निर्देशिका और सभी फ़ाइलों को हटाने के लिए। आपको कस्टम फ़ंक्शन लिखना नहीं है।

+6

यह काम नहीं किया इसलिए मैंने खोजा और कस्टम फ़ंक्शन पाया .. –

+0

इसका उपयोग करते समय आपको क्या अपवाद मिला? यह .NET फ्रेमवर्क विधि है और इसे तब तक काम करना चाहिए जब तक आपको अनुमतियों के साथ कुछ समस्याएं न हों। –

+10

दस्तावेज़ीकरण से भी: 'कुछ मामलों में, यदि आपके पास फ़ाइल एक्सप्लोरर में निर्दिष्ट निर्देशिका है, तो हटाएं विधि इसे हटाने में सक्षम नहीं हो सकती है।' –

9

यह उतना पूरा नहीं है जितना मैं चाहूंगा, लेकिन ये ऐसी चीजें हैं जिन्होंने मुझे अतीत में मदद की है जब मुझे इसी तरह के मुद्दों का सामना करना पड़ा।

फ़ाइल किसी अन्य चीज़ द्वारा उपयोग में है। इसका मतलब है कि आपने एक फ़ोल्डर/फ़ाइल बनाई है और अभी तक इसे जारी नहीं किया है। उपयोग करें।() लागू() जहां लागू हो)।

एक लॉक संबंधित मुद्दा।

आपने Directory.Delete(rootFolder, true) (जहां सच्चे साधनों को रिकर्सिवली से हटाया जाता है) का उपयोग किया है, जब निर्दिष्ट रूट फ़ोल्डर में कोई फ़ोल्डर्स नहीं हैं।

यह किसी अन्य कार्यक्रम द्वारा खुला है। अब, मुझे नहीं पता कि Process Monitor इंस्टॉल करने के अलावा इस पर कहां से शुरू करना है, जो मदद कर सकता है लेकिन यह केवल कुछ स्थितियों में वास्तव में काम करता है।

एंटी वायरस जैसी चीजें, या यहां तक ​​कि (विंडोज़ पर) डिफेंडर जैसी चीजें इस मुद्दे को अतीत में हुई हैं।

जब आप Directory.Delete फोन और एक फ़ाइल इस तरह से खुला है, Directory.Delete सभी फ़ाइलों को हटाने में सफल होता है, लेकिन जब Directory.Delete RemoveDirectory कॉल एक अपवाद क्योंकि फेंक दिया जाता है "निर्देशिका खाली नहीं है" हटाने के लिए चिह्नित एक फ़ाइल है लेकिन वास्तव में हटाई नहीं गई है।

स्पष्ट चीजों में यह सुनिश्चित करना शामिल है कि आपको फ़ोल्डर को हटाने की अनुमति है (केवल आप ही नहीं, बल्कि कार्यक्रम के तहत चल रहा है)।

जिस फ़ाइल को आप हटाने का प्रयास कर रहे हैं वह केवल पढ़ने योग्य है। फ़ोल्डर में सभी फ़ाइलों के फ़ाइल विशेषताओं को केवल पढ़ने-पढ़ने से पहले बदलें।

पथ अन्य विंडोज घटकों द्वारा साझा किया जाता है ताकि आप फ़ोल्डर्स बना रहे/हटा रहे हों।

Source
Source

+0

वाह! इस सारी जानकारी के लिए धन्यवाद। एकमात्र चीज जिसे मैंने कभी हल करने की कोशिश नहीं की है (हाँ, यह अनसुलझा रहता है!) का उपयोग करना है। कृपया मैं इसे आज़मा दूंगा और आपको बता दूंगा। मैं वास्तव में दूसरों की मदद करने के बारे में आपकी पोस्ट और इरादों की सराहना करता हूं। धन्यवाद .. –

+0

कृपया अपने निष्कर्ष भी साझा करें, मैं संघर्ष कर रहा हूं। मैंने डाउनलोड लिंक को शामिल करने के लिए अपनी पोस्ट अपडेट की है, मेरा सुझाव है कि आप इसका इस्तेमाल करें और फ़िल्टरिंग सीखें (इसमें 5 मिनट से भी कम समय लगेगा) क्योंकि यह वास्तव में कुछ प्रकाश – Dave

+0

http://stackoverflow.com/a/12544296/206730 "शेड कर सकता है। शायद विंडोज एक्सप्लोरर में किसी तरह की देरी/कैशिंग के कारण है। " – Kiquenet

14

यह मेरे लिए काम करता है, भले ही मैं फ़ाइल एक्सप्लोरर खुला है:

public static void DeleteFilesAndFoldersRecursively(string target_dir) 
{ 
    foreach (string file in Directory.GetFiles(target_dir)) 
    { 
     File.Delete(file); 
    } 

    foreach (string subDir in Directory.GetDirectories(target_dir)) 
    { 
     DeleteFilesAndFoldersRecursively(subDir); 
    } 

    Thread.Sleep(1); // This makes the difference between whether it works or not. Sleep(0) is not enough. 
    Directory.Delete(target_dir); 
} 
+1

यह मेरे लिए काम करता है – JGilmartin

0

मेरे मामले में, मैं अपने कार्यक्रम व्यवस्थापक के रूप में चल रहा है के साथ अपने निर्देशिका बनाया है। जब मैंने व्यवस्थापक अधिकारों के बिना एक ही निर्देशिका को हटाने की कोशिश की, तो मुझे "निर्देशिका खाली नहीं है" त्रुटि मिली।

समाधान: या तो व्यवस्थापक को व्यवस्थापक के रूप में चलाएं या इसे मैन्युअल रूप से हटाएं।

1

यह समस्या मुझे पागल कर रही थी। निर्देशिका और इसकी सामग्री को हटाने के लिए Directory.Delete(dirPath, recursive: true); का उपयोग करते समय मैं पोस्टर का सटीक व्यवहार देख रहा था। और पोस्टर की तरह, भले ही कॉल ने एक अपवाद फेंक दिया "निर्देशिका खाली नहीं है।" कॉल ने वास्तव में निर्देशिका की सभी सामग्री को दोबारा हटा दिया था लेकिन प्रदान किए गए पथ की मूल निर्देशिका को हटाने में विफल रहा। पागलपन।

मेरे मामले में मैंने पाया कि यह मुद्दा पर लाया गया था या नहीं, क्या विंडो के एक्सप्लोरर में बाएं नेविगेशन पेड़ दिखाया गया था कि निर्देशिका को खोलने की कोशिश कर रहा था। यदि ऐसा है, तो निर्देशिका की सामग्री के डिलीट के कुछ प्रकार के कतारबद्ध डिलीट या कैशिंग को समस्या उत्पन्न हो रही है। यह व्यवहार squirrely और अप्रत्याशित प्रतीत हो सकता है क्योंकि हटाए जाने वाले विंडोज एक्सप्लोरर में निर्देशिका को देखने से यह समस्या नहीं होती है जब तक कि विंडोज़ बाएं नेविगेशन पेड़ में निर्देशिका नहीं खुलती है।

कुछ स्पष्ट चित्रों को स्पष्ट करने के लिए शायद आवश्यक हैं। नीचे दिए गए पथ में ध्यान दें कि खिड़की 1346 दिखा रही है। 1346 निर्देशिका 1001 की एक बाल निर्देशिका है। इस मामले में 1346 को फिर से हटाने का आह्वान सफल होगा क्योंकि यह कोई मुद्दा नहीं है कि हम विंडो के एक्सप्लोरर प्रति 1346 पर देख रहे हैं।

enter image description here

लेकिन नीचे चित्र में, रास्ते में देखा कि नीचे हम निर्देशिका 1018 लेकिन छोड़ दिया नैव में देख रहे हैं हम निर्देशिका 1349 (तीर देखें) खोल दिया है। यह कम से कम मेरे लिए समस्या का कारण बनता है। यदि इस स्थिति में हम निर्देशिका 1349 के dirPath के लिए Directory.Delete(dirPath, recursive: true); पर कॉल करते हैं तो यह "निर्देशिका खाली नहीं है" फेंक देगा। अपवाद। लेकिन अगर हम अपवाद होने के बाद निर्देशिका की जांच करते हैं तो हम पाएंगे कि उसने निर्देशिका की सभी सामग्री हटा दी है और वास्तव में अब खाली है।

तो यह एक एज केस परिदृश्य की तरह दिखता है लेकिन यह एक ऐसा है जिसे हम डेवलपर चला सकते हैं क्योंकि जब हम कोड का परीक्षण कर रहे हैं तो हम यह देखने के लिए देखना चाहते हैं कि फ़ोल्डर हटा दिया गया है या नहीं। और यह समझना चुनौतीपूर्ण है कि इसे किस प्रकार ट्रिगर कर रहा है क्योंकि यह विंडो एक्सप्लोरर के बाएं नेविगेशन बार के बारे में है जो खिड़की का मुख्य सामग्री क्षेत्र नहीं है।

enter image description here

वैसे भी, के रूप में ज्यादा मैं नीचे दिए गए कोड को नापसंद के रूप में, यह सभी मामलों में मेरे लिए समस्या का समाधान करता है:

 //delete the directory and it's contents if the directory exists 
     if (Directory.Exists(dirPath)) { 
      try { 
       Directory.Delete(dirPath, recursive: true);    //throws if directory doesn't exist. 
      } catch { 
       //HACK because the recursive delete will throw with an "Directory is not empty." 
       //exception after it deletes all the contents of the diretory if the directory 
       //is open in the left nav of Windows's explorer tree. This appears to be a caching 
       //or queuing latency issue. Waiting 2 secs for the recursive delete of the directory's 
       //contents to take effect solved the issue for me. Hate it I do, but it was the only 
       //way I found to work around the issue. 
       Thread.Sleep(2000);  //wait 2 seconds 
       Directory.Delete(dirPath, recursive: true); 
      } 
     } 

मुझे आशा है कि यह दूसरों मदद करता है। ट्रैक करने और समझाने में काफी समय लगा क्योंकि यह वास्तव में अजीब व्यवहार है।

संबंधित मुद्दे