আপনি যদি ডিরেক্টরিটি পুনরাবৃত্তভাবে মুছে ফেলার চেষ্টা করছেন এবং এক্সপ্লোরারটিতে 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
এক্সপ্লোরারে খোলা থাকে এবং আপনি এটি ব্যবহার করেন 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
এবং ব্যর্থ হতে পারেন এমন ঝুঁকি রয়েছে । এই সমাধানটিকে আরও দৃ rec় পুনরাবৃত্তি মোছার জন্য একটি প্রাথমিক পয়েন্ট বিবেচনা করুন।
সাধারণ উত্তর
এই সমাধানটি কেবল উইন্ডোজ এক্সপ্লোরারের সাথে কথোপকথনের বিশেষত্বগুলিকে সম্বোধন করে। আপনি যদি রক-সলিড মুছুন অপারেশন চান, তবে একটি জিনিস মনে রাখতে হবে তা হ'ল যে কোনও কিছু (ভাইরাস স্ক্যানার, যাই হোক না কেন) যে কোনও সময় আপনি মুছে ফেলার চেষ্টা করছেন তার উন্মুক্ত হ্যান্ডেল থাকতে পারে। সুতরাং আপনাকে পরে আবার চেষ্টা করতে হবে। কত পরে, এবং আপনি কতবার চেষ্টা করেছেন তা নির্ভর করে যে অবজেক্টটি মোছা হবে তা কতটা গুরুত্বপূর্ণ। এমএসডিএন ইঙ্গিত হিসাবে ,
দৃust় ফাইল পুনরাবৃত্তি কোড ফাইল ফাইলের অনেক জটিলতা অ্যাকাউন্টে নিতে হবে।
এই নিরীহ বিবৃতিটি, কেবলমাত্র এনটিএফএসের রেফারেন্স ডকুমেন্টেশনের লিঙ্ক সহ সরবরাহ করা উচিত, আপনার চুলগুলি দাঁড়ানো উচিত।
( সম্পাদনা করুন : প্রচুর This এই উত্তরের মূলত কেবলমাত্র প্রথম, অসম্পূর্ণ সমাধান ছিল))