সি # ব্যবহার করে, আমি কীভাবে কোনও ডিরেক্টরি থেকে সমস্ত ফাইল এবং ফোল্ডার মুছতে পারি, তবে তারপরেও রুট ডিরেক্টরিটি রাখতে পারি?
সি # ব্যবহার করে, আমি কীভাবে কোনও ডিরেক্টরি থেকে সমস্ত ফাইল এবং ফোল্ডার মুছতে পারি, তবে তারপরেও রুট ডিরেক্টরিটি রাখতে পারি?
উত্তর:
System.IO.DirectoryInfo di = new DirectoryInfo("YourPath");
foreach (FileInfo file in di.GetFiles())
{
file.Delete();
}
foreach (DirectoryInfo dir in di.GetDirectories())
{
dir.Delete(true);
}
আপনার ডিরেক্টরিতে যদি অনেকগুলি ফাইল থাকতে পারে EnumerateFiles()
তবে তার চেয়েও বেশি দক্ষ GetFiles()
because কারণ আপনি যখন ব্যবহার করেন EnumerateFiles()
তখন পুরো সংগ্রহটি ফিরে আসার আগে আপনি এটি গণনা শুরু করতে পারেন, GetFiles()
যেখানে এটির গণনা শুরু করার আগে আপনাকে পুরো সংগ্রহটি মেমোরিতে লোড করা দরকার opposed এই উদ্ধৃতিটি এখানে দেখুন :
অতএব, আপনি যখন অনেকগুলি ফাইল এবং ডিরেক্টরিগুলি নিয়ে কাজ করছেন তখন এনিউমারেট ফাইলস () আরও দক্ষ হতে পারে।
একই প্রযোজ্য EnumerateDirectories()
এবং GetDirectories()
। সুতরাং কোডটি হবে:
foreach (FileInfo file in di.EnumerateFiles())
{
file.Delete();
}
foreach (DirectoryInfo dir in di.EnumerateDirectories())
{
dir.Delete(true);
}
এই প্রশ্নের প্রয়োজনে, সত্যই ব্যবহার করার কোনও কারণ নেই GetFiles()
এবং GetDirectories()
।
Directory.Delete(path, true)
সব :) যত্ন নিতে হবে
file.Delete()
।
হ্যাঁ, এটি করার সঠিক উপায়। যদি আপনি নিজেকে "ক্লিন" (বা যেমন আমি একে "খালি" ফাংশন বলতে পছন্দ করি) দিতে চাইছেন তবে আপনি একটি এক্সটেনশন পদ্ধতি তৈরি করতে পারেন।
public static void Empty(this System.IO.DirectoryInfo directory)
{
foreach(System.IO.FileInfo file in directory.GetFiles()) file.Delete();
foreach(System.IO.DirectoryInfo subDirectory in directory.GetDirectories()) subDirectory.Delete(true);
}
এটি আপনাকে এর পরে এমন কিছু করার অনুমতি দেয় ...
System.IO.DirectoryInfo directory = new System.IO.DirectoryInfo(@"C:\...");
directory.Empty();
Empty
ইতিমধ্যে সি # বিদ্যমান, জন্য string
। আমি যদি অন্য কোনও নাম Empty
দেখি তবে আমি অবাক হয়ে যাব যদি এটি আমাকে bool
খালি খালি না হয় বলে দেয় বা তার পরিবর্তে অবজেক্টটি (বা ফাইল সিস্টেম) পরিবর্তন করে । যে কারণে, আমি নাম দিয়ে যেতে হবে Clean
।
Is
(অর্থাত্ IsEmpty
তার পরিবর্তে Empty
) এর সাথে উপসর্গ করা ।
নিম্নলিখিত কোডটি পুনরাবৃত্তভাবে ফোল্ডারটি সাফ করবে:
private void clearFolder(string FolderName)
{
DirectoryInfo dir = new DirectoryInfo(FolderName);
foreach(FileInfo fi in dir.GetFiles())
{
fi.Delete();
}
foreach (DirectoryInfo di in dir.GetDirectories())
{
clearFolder(di.FullName);
di.Delete();
}
}
new System.IO.DirectoryInfo(@"C:\Temp").Delete(true);
//Or
System.IO.Directory.Delete(@"C:\Temp", true);
Delete
ডিরেক্টরি উপস্থিত না থাকলে নিক্ষেপ করবে, তাই Directory.Exists
প্রথমে একটি চেক করা নিরাপদ হবে ।
Directory.Exists
যথেষ্ট নয়; চেকের পরে, অন্য থ্রেডটি ডিরেক্টরিটির নাম পরিবর্তন বা সরিয়ে ফেলতে পারে। এটি আরও নিরাপদ try-catch
।
Directory.Create
কারণ পুনরাবৃত্তিকে সংক্রামিত হওয়ার Directory.Delete
নিশ্চয়তা দেওয়া হয় না ..
আমরা লিনকুইয়ের প্রতি ভালবাসাও প্রদর্শন করতে পারি :
using System.IO;
using System.Linq;
…
var directory = Directory.GetParent(TestContext.TestDir);
directory.EnumerateFiles()
.ToList().ForEach(f => f.Delete());
directory.EnumerateDirectories()
.ToList().ForEach(d => d.Delete(true));
মনে রাখবেন যে এখানে আমার সমাধানটি পারফরম্যান্ট নয়, কারণ আমি ব্যবহার করছি Get*().ToList().ForEach(...)
যা একই IEnumerable
বার দুবার উৎপন্ন করে । আমি এই সমস্যাটি এড়াতে একটি এক্সটেনশন পদ্ধতি ব্যবহার করি:
using System.IO;
using System.Linq;
…
var directory = Directory.GetParent(TestContext.TestDir);
directory.EnumerateFiles()
.ForEachInEnumerable(f => f.Delete());
directory.EnumerateDirectories()
.ForEachInEnumerable(d => d.Delete(true));
এটি এক্সটেনশন পদ্ধতি:
/// <summary>
/// Extensions for <see cref="System.Collections.Generic.IEnumerable"/>.
/// </summary>
public static class IEnumerableOfTExtensions
{
/// <summary>
/// Performs the <see cref="System.Action"/>
/// on each item in the enumerable object.
/// </summary>
/// <typeparam name="TEnumerable">The type of the enumerable.</typeparam>
/// <param name="enumerable">The enumerable.</param>
/// <param name="action">The action.</param>
/// <remarks>
/// “I am philosophically opposed to providing such a method, for two reasons.
/// …The first reason is that doing so violates the functional programming principles
/// that all the other sequence operators are based upon. Clearly the sole purpose of a call
/// to this method is to cause side effects.”
/// —Eric Lippert, “foreach” vs “ForEach” [http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx]
/// </remarks>
public static void ForEachInEnumerable<TEnumerable>(this IEnumerable<TEnumerable> enumerable, Action<TEnumerable> action)
{
foreach (var item in enumerable)
{
action(item);
}
}
}
foreach (var dir in info.GetDirectories("*", SearchOption.AllDirectories).OrderByDescending(dir => dir.FullName.Length)) dir.Delete();
হতে পারে।
directory.EnumerateFiles()
এবং এর directory.EnumerateDirectories()
পরিবর্তে বিবেচনা করুন directory.Get*()
।
IEnumerable<T>.ForEach()
এক্সটেনশনের একটি সংক্ষিপ্ত XML মন্তব্য রয়েছে, "লঙ্ঘন! লঙ্ঘন! অশুদ্ধ!"।
সহজ উপায়:
Directory.Delete(path,true);
Directory.CreateDirectory(path);
সচেতন হন যে এটি ফোল্ডারে কিছু অনুমতি মুছে ফেলতে পারে।
private void ClearFolder(string FolderName)
{
DirectoryInfo dir = new DirectoryInfo(FolderName);
foreach(FileInfo fi in dir.GetFiles())
{
try
{
fi.Delete();
}
catch(Exception) { } // Ignore all exceptions
}
foreach(DirectoryInfo di in dir.GetDirectories())
{
ClearFolder(di.FullName);
try
{
di.Delete();
}
catch(Exception) { } // Ignore all exceptions
}
}
যদি আপনি জানেন যে কোনও সাব-ফোল্ডার নেই, তবে এর মতো কিছু সহজেই হতে পারে:
Directory.GetFiles(folderName).ForEach(File.Delete)
আমি চেষ্টা করেছি প্রতিটি পদ্ধতি, তারা System.IO ত্রুটি সহ কোনও পর্যায়ে ব্যর্থ হয়েছে। ফোল্ডারটি খালি থাকুক বা না থাকুক, কেবল পঠনযোগ্য থাকুক বা না থাকুক, ইত্যাদি জন্য নিম্নলিখিত পদ্ধতিটি নিশ্চিতভাবে কাজ করে
ProcessStartInfo Info = new ProcessStartInfo();
Info.Arguments = "/C rd /s /q \"C:\\MyFolder"";
Info.WindowStyle = ProcessWindowStyle.Hidden;
Info.CreateNoWindow = true;
Info.FileName = "cmd.exe";
Process.Start(Info);
এখানে সমস্ত পোস্ট পড়ার পরে আমি যে সরঞ্জামটি শেষ করেছি তা এখানে। এটা করে
এটা সঙ্গে পুলিশ
এটি ডিরেক্টরিটি ব্যবহার করে না e মুছুন কারণ ব্যতিক্রমের প্রক্রিয়াটি বাতিল হয়ে গেছে।
/// <summary>
/// Attempt to empty the folder. Return false if it fails (locked files...).
/// </summary>
/// <param name="pathName"></param>
/// <returns>true on success</returns>
public static bool EmptyFolder(string pathName)
{
bool errors = false;
DirectoryInfo dir = new DirectoryInfo(pathName);
foreach (FileInfo fi in dir.EnumerateFiles())
{
try
{
fi.IsReadOnly = false;
fi.Delete();
//Wait for the item to disapear (avoid 'dir not empty' error).
while (fi.Exists)
{
System.Threading.Thread.Sleep(10);
fi.Refresh();
}
}
catch (IOException e)
{
Debug.WriteLine(e.Message);
errors = true;
}
}
foreach (DirectoryInfo di in dir.EnumerateDirectories())
{
try
{
EmptyFolder(di.FullName);
di.Delete();
//Wait for the item to disapear (avoid 'dir not empty' error).
while (di.Exists)
{
System.Threading.Thread.Sleep(10);
di.Refresh();
}
}
catch (IOException e)
{
Debug.WriteLine(e.Message);
errors = true;
}
}
return !errors;
}
নিম্নলিখিত কোডটি ডিরেক্টরিটি পরিষ্কার করবে, তবে রুট ডিরেক্টরিটি সেখানে রেখে দেবে (পুনরাবৃত্ত)।
Action<string> DelPath = null;
DelPath = p =>
{
Directory.EnumerateFiles(p).ToList().ForEach(File.Delete);
Directory.EnumerateDirectories(p).ToList().ForEach(DelPath);
Directory.EnumerateDirectories(p).ToList().ForEach(Directory.Delete);
};
DelPath(path);
আমি ব্যবহার করতাম
Directory.GetFiles(picturePath).ToList().ForEach(File.Delete);
পুরানো ছবি মোছার জন্য এবং এই ফোল্ডারে আমার কোনও বস্তুর দরকার নেই
ফাইলআইএনফো এবং ডিরেক্টরি ইন্ফোর পরিবর্তে ফাইল এবং ডিরেক্টরি দিয়ে কেবল স্থিতিশীল পদ্ধতি ব্যবহার করা দ্রুত সম্পাদন করবে। ( সি # তে ফাইল এবং ফাইলআইনফোর মধ্যে পার্থক্য কী তা স্বীকৃত উত্তর দেখুন )। উত্তরটি ইউটিলিটি পদ্ধতি হিসাবে দেখানো হয়েছে।
public static void Empty(string directory)
{
foreach(string fileToDelete in System.IO.Directory.GetFiles(directory))
{
System.IO.File.Delete(fileToDelete);
}
foreach(string subDirectoryToDeleteToDelete in System.IO.Directory.GetDirectories(directory))
{
System.IO.Directory.Delete(subDirectoryToDeleteToDelete, true);
}
}
string directoryPath = "C:\Temp";
Directory.GetFiles(directoryPath).ToList().ForEach(File.Delete);
Directory.GetDirectories(directoryPath).ToList().ForEach(Directory.Delete);
উইন্ডোজ In-এ, আপনি যদি উইন্ডোজ এক্সপ্লোরার দিয়ে স্রেফ এটি ম্যানুয়ালি তৈরি করে থাকেন, তবে ডিরেক্টরি কাঠামোটি এর অনুরূপ:
C:
\AAA
\BBB
\CCC
\DDD
ডিরেক্টরি সিটি পরিষ্কার করার জন্য মূল প্রশ্নে প্রস্তাবিত কোডটি চালানো:: এএএ, di.Delete(true)
বিবিবি মোছার চেষ্টা করার সময় লাইনটি সর্বদা আইওএক্সেপশন "ডিরেক্টরিটি খালি নয়" দিয়ে ব্যর্থ হয়। এটি সম্ভবত উইন্ডোজ এক্সপ্লোরারে একরকম বিলম্ব / ক্যাশে হওয়ার কারণে।
নিম্নলিখিত কোডটি আমার জন্য নির্ভরযোগ্যভাবে কাজ করে:
static void Main(string[] args)
{
DirectoryInfo di = new DirectoryInfo(@"c:\aaa");
CleanDirectory(di);
}
private static void CleanDirectory(DirectoryInfo di)
{
if (di == null)
return;
foreach (FileSystemInfo fsEntry in di.GetFileSystemInfos())
{
CleanDirectory(fsEntry as DirectoryInfo);
fsEntry.Delete();
}
WaitForDirectoryToBecomeEmpty(di);
}
private static void WaitForDirectoryToBecomeEmpty(DirectoryInfo di)
{
for (int i = 0; i < 5; i++)
{
if (di.GetFileSystemInfos().Length == 0)
return;
Console.WriteLine(di.FullName + i);
Thread.Sleep(50 * i);
}
}
এই সংস্করণটি পুনরাবৃত্তি কলগুলি ব্যবহার করে না, এবং কেবলমাত্র পঠনযোগ্য সমস্যা সমাধান করে।
public static void EmptyDirectory(string directory)
{
// First delete all the files, making sure they are not readonly
var stackA = new Stack<DirectoryInfo>();
stackA.Push(new DirectoryInfo(directory));
var stackB = new Stack<DirectoryInfo>();
while (stackA.Any())
{
var dir = stackA.Pop();
foreach (var file in dir.GetFiles())
{
file.IsReadOnly = false;
file.Delete();
}
foreach (var subDir in dir.GetDirectories())
{
stackA.Push(subDir);
stackB.Push(subDir);
}
}
// Then delete the sub directories depth first
while (stackB.Any())
{
stackB.Pop().Delete();
}
}
নিম্নলিখিত উদাহরণটি দেখায় যে আপনি কীভাবে এটি করতে পারেন। এটি প্রথমে কিছু ডিরেক্টরি এবং একটি ফাইল তৈরি করে এবং এরপরে সেগুলি সরিয়ে দেয় Directory.Delete(topPath, true);
:
static void Main(string[] args)
{
string topPath = @"C:\NewDirectory";
string subPath = @"C:\NewDirectory\NewSubDirectory";
try
{
Directory.CreateDirectory(subPath);
using (StreamWriter writer = File.CreateText(subPath + @"\example.txt"))
{
writer.WriteLine("content added");
}
Directory.Delete(topPath, true);
bool directoryExists = Directory.Exists(topPath);
Console.WriteLine("top-level directory exists: " + directoryExists);
}
catch (Exception e)
{
Console.WriteLine("The process failed: {0}", e.Message);
}
}
এটি https://msdn.microsoft.com/en-us/library/fxeahc5f(v=vs.110).aspx থেকে নেওয়া হয়েছে ।
উপরের সমস্যাটি মোকাবেলা করার সর্বোত্তম উপায় নয়। তবে এটি একটি বিকল্প ...
while (Directory.GetDirectories(dirpath).Length > 0)
{
//Delete all files in directory
while (Directory.GetFiles(Directory.GetDirectories(dirpath)[0]).Length > 0)
{
File.Delete(Directory.GetFiles(dirpath)[0]);
}
Directory.Delete(Directory.GetDirectories(dirpath)[0]);
}
DirectoryInfo Folder = new DirectoryInfo(Server.MapPath(path));
if (Folder .Exists)
{
foreach (FileInfo fl in Folder .GetFiles())
{
fl.Delete();
}
Folder .Delete();
}
এটি প্রদর্শিত হবে যে আমরা কীভাবে ফোল্ডারটি মুছব এবং এটির জন্য পরীক্ষা করব যে আমরা পাঠ্য বাক্সটি ব্যবহার করি
using System.IO;
namespace delete_the_folder
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Deletebt_Click(object sender, EventArgs e)
{
//the first you should write the folder place
if (Pathfolder.Text=="")
{
MessageBox.Show("ples write the path of the folder");
Pathfolder.Select();
//return;
}
FileAttributes attr = File.GetAttributes(@Pathfolder.Text);
if (attr.HasFlag(FileAttributes.Directory))
MessageBox.Show("Its a directory");
else
MessageBox.Show("Its a file");
string path = Pathfolder.Text;
FileInfo myfileinf = new FileInfo(path);
myfileinf.Delete();
}
}
}
using System.IO;
string[] filePaths = Directory.GetFiles(@"c:\MyDir\");
foreach (string filePath in filePaths)
File.Delete(filePath);
মূল থেকে কল
static void Main(string[] args)
{
string Filepathe =<Your path>
DeleteDirectory(System.IO.Directory.GetParent(Filepathe).FullName);
}
এই পদ্ধতিটি যুক্ত করুন
public static void DeleteDirectory(string path)
{
if (Directory.Exists(path))
{
//Delete all files from the Directory
foreach (string file in Directory.GetFiles(path))
{
File.Delete(file);
}
//Delete all child Directories
foreach (string directory in Directory.GetDirectories(path))
{
DeleteDirectory(directory);
}
//Delete a Directory
Directory.Delete(path);
}
}
foreach (string file in System.IO.Directory.GetFiles(path))
{
System.IO.File.Delete(file);
}
foreach (string subDirectory in System.IO.Directory.GetDirectories(path))
{
System.IO.Directory.Delete(subDirectory,true);
}
ফোল্ডারটি মুছতে, এটি পাঠ্য বাক্স এবং একটি বোতাম ব্যবহার করে কোড using System.IO;
:
private void Deletebt_Click(object sender, EventArgs e)
{
System.IO.DirectoryInfo myDirInfo = new DirectoryInfo(@"" + delete.Text);
foreach (FileInfo file in myDirInfo.GetFiles())
{
file.Delete();
}
foreach (DirectoryInfo dir in myDirInfo.GetDirectories())
{
dir.Delete(true);
}
}
private void ClearDirectory(string path)
{
if (Directory.Exists(path))//if folder exists
{
Directory.Delete(path, true);//recursive delete (all subdirs, files)
}
Directory.CreateDirectory(path);//creates empty directory
}
Directory.CreateDirectory
IO.Directory.Delete(HttpContext.Current.Server.MapPath(path), True)
এর চেয়ে বেশি আপনার দরকার নেই