यदि आप निर्देशिका को पुन: हटाने की कोशिश कर रहे हैं a
और a\b
एक्सप्लोरर में निर्देशिका खुली है, b
तो हटा दी जाएगी , लेकिन आपको यह त्रुटि 'निर्देशिका खाली नहीं है' के लिए a
मिलेगी , भले ही यह खाली हो जब आप जाते हैं और देखते हैं। किसी भी एप्लिकेशन (एक्सप्लोरर सहित) की वर्तमान निर्देशिका डायरेक्टरी को संभालती है । जब आप कॉल करते हैं Directory.Delete(true)
, तो यह नीचे से हटा दिया जाता है: b
तब a
। यदि b
एक्सप्लोरर में खुला है, तो एक्सप्लोरर विलोपन का पता लगाएगा b
, निर्देशिका को ऊपर की ओर बदल देगा cd ..
और खुले हैंडल को साफ कर देगा। चूंकि फ़ाइल सिस्टम अतुल्यकालिक रूप से संचालित होता है, इसलिए Directory.Delete
एक्सप्लोरर के साथ संघर्ष के कारण ऑपरेशन विफल हो जाता है।
अधूरा हल
मैं मूल समाधान को जारी करने के लिए एक्सप्लोरर थ्रेड को हैंडल करने की अनुमति देने के विचार के साथ मूल समाधान को मूल रूप से निम्नलिखित समाधान पोस्ट करता हूं।
// incomplete!
try
{
Directory.Delete(path, true);
}
catch (IOException)
{
Thread.Sleep(0);
Directory.Delete(path, true);
}
लेकिन यह केवल तभी काम करता है जब खुली निर्देशिका उस निर्देशिका का तत्काल बच्चा है जिसे आप हटा रहे हैं। यदि a\b\c\d
Explorer में खुला है और आप इस पर उपयोग a
, इस तकनीक को हटाने के बाद विफल हो जाएगा d
और c
।
कुछ हद तक बेहतर उपाय
यह विधि एक गहरी निर्देशिका संरचना को हटाने का काम करेगी भले ही एक्सप्लोरर में निचले स्तर की निर्देशिका में से कोई एक खुली हो।
/// <summary>
/// Depth-first recursive delete, with handling for descendant
/// directories open in Windows Explorer.
/// </summary>
public static void DeleteDirectory(string path)
{
foreach (string directory in Directory.GetDirectories(path))
{
DeleteDirectory(directory);
}
try
{
Directory.Delete(path, true);
}
catch (IOException)
{
Directory.Delete(path, true);
}
catch (UnauthorizedAccessException)
{
Directory.Delete(path, true);
}
}
अपने दम पर काम करने के अतिरिक्त काम के बावजूद, हमें अभी भी संभालना हैUnauthorizedAccessException
जो रास्ते में हो सकता है। यह स्पष्ट नहीं है कि पहला विलोपन का प्रयास दूसरे, सफल एक के लिए मार्ग प्रशस्त कर रहा है, या यदि यह केवल अपवाद को फेंकने / पकड़ने के द्वारा शुरू की गई समय की देरी है, जो फ़ाइल सिस्टम को पकड़ने की अनुमति देता है।
आप ब्लॉक Thread.Sleep(0)
की शुरुआत में जोड़कर और विशेष परिस्थितियों में पकड़े गए अपवादों की संख्या को कम करने में सक्षम हो सकते हैं try
। इसके अतिरिक्त, एक जोखिम है कि भारी सिस्टम लोड के तहत, आप दोनों Directory.Delete
प्रयासों के माध्यम से उड़ सकते हैं और असफल हो सकते हैं। इस समाधान पर अधिक मजबूत पुनरावर्ती विलोपन के लिए एक प्रारंभिक बिंदु पर विचार करें।
सामान्य उत्तर
यह समाधान केवल Windows Explorer के साथ सहभागिता की ख़ासियत को संबोधित करता है। यदि आप रॉक-सॉलिड डिलीट ऑपरेशन चाहते हैं, तो एक बात का ध्यान रखें कि कुछ भी (वायरस स्कैनर, जो भी हो) किसी भी समय आप जो भी डिलीट करने की कोशिश कर रहे हैं, उसका एक खुला हैंडल हो सकता है। इसलिए आपको बाद में फिर से प्रयास करना होगा। बाद में कितनी बार, और कितनी बार आप प्रयास करते हैं, यह इस बात पर निर्भर करता है कि वह वस्तु कितनी महत्वपूर्ण है। के रूप में MSDN इंगित करता है ,
मजबूत फ़ाइल पुनरावृत्ति कोड को फाइल सिस्टम की कई जटिलताओं को ध्यान में रखना चाहिए।
यह निर्दोष बयान, NTFS संदर्भ प्रलेखन के लिए केवल एक लिंक के साथ आपूर्ति की, अपने बाल खड़े करने के लिए चाहिए।
( संपादित करें : बहुत। यह उत्तर मूल रूप से केवल पहला, अधूरा समाधान था।)