কিভাবে C#ডিরেক্টরির মধ্যে সমস্ত ফাইল recursively তালিকাভুক্ত?




.net (12)

কিভাবে C # ডিরেক্টরিতে ডিরেক্টরি এবং শিশু ডিরেক্টরিগুলিতে সমস্ত ফাইল পুনরাবৃত্তি করবেন?


.NET 4.5 তে, অন্তত, এই সংস্করণটি খুবই ছোট এবং এতে তালিকার অন্তর্ভুক্তির জন্য কোনও ফাইলের মানদণ্ডের মূল্যায়ন করার অতিরিক্ত বোনাস রয়েছে:

    /// </remarks>
    public static IEnumerable<string> GetAllFiles(string path, Func<FileInfo, bool> checkFile = null)
    {
        string mask = Path.GetFileName(path);
        if (string.IsNullOrEmpty(mask))
            mask = "*.*";
        path = Path.GetDirectoryName(path);
        string[] files = Directory.GetFiles(path, mask, SearchOption.AllDirectories);
        foreach (string file in files)
        {
            if (checkFile == null || checkFile(new FileInfo(file)))
                yield return file;
        }
    }

ভালো ব্যবহার করুন:

        string folder = Config.TestInput();
        string mask = folder + "*.*";
        var list = UT.GetAllFiles(mask, (info) => Path.GetExtension(info.Name) == ".html").ToList();
        Assert.AreNotEqual(0, list.Count);
        var lastQuarter = DateTime.Now.AddMonths(-3);
        list = UT.GetAllFiles(mask, (info) => info.CreationTime >= lastQuarter).ToList();
        Assert.AreNotEqual(0, list.Count);

আমি ডিরেক্টরীইনফো ব্যবহার করতে পছন্দ করি কারণ আমি ফাইলইনফোর পেতে পারি, শুধু স্ট্রিং নয়।

        string baseFolder = @"C:\temp";
        DirectoryInfo di = new DirectoryInfo(baseFolder);

        string searchPattern = "*.xml";

        ICollection<FileInfo> matchingFileInfos = di.GetFiles(searchPattern, SearchOption.AllDirectories)
            .Select(x => x)
            .ToList();

আমি ভবিষ্যতে এই ক্ষেত্রে যদি FileInfo বৈশিষ্ট্য উপর ভিত্তি করে ভবিষ্যতে ফিল্টারিং প্রয়োজন।

        string baseFolder = @"C:\temp";
        DirectoryInfo di = new DirectoryInfo(baseFolder);

        string searchPattern = "*.xml";

        ICollection<FileInfo> matchingFileInfos = di.GetFiles(searchPattern, SearchOption.AllDirectories)
            .Where(x => x.LastWriteTimeUtc < DateTimeOffset.Now)
            .Select(x => x)
            .ToList();

প্রয়োজন হলে আমি স্ট্রিং ফিরে অবলম্বন করতে পারেন। (এবং এখনও ফিল্টার / যেখানে-ক্লোজ স্টাফ জন্য ভবিষ্যতে প্রমাণিত।

        string baseFolder = @"C:\temp";
        DirectoryInfo di = new DirectoryInfo(baseFolder);

        string searchPattern = "*.xml";

        ICollection<string> matchingFileNames = di.GetFiles(searchPattern, SearchOption.AllDirectories)
            .Select(x => x.FullName)
            .ToList();

উল্লেখ্য, " " যদি আপনি এক্সটেনশান দ্বারা ফিল্টার করতে চান তবে একটি বৈধ অনুসন্ধান প্যাটার্ন।


এই একটি আমাকে একটি ডিরেক্টরি এবং সাব ডিরেক্টরি সব ফাইল পেতে সাহায্য, কেউ জন্য সহায়ক হতে পারে। [উপরের উত্তর থেকে অনুপ্রাণিত]

static void Main(string[] args)
    {
        try
        {
            var root = @"G:\logs";
            DirectorySearch(root);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadKey();
    }





public static void DirectorySearch(string root, bool isRootItrated = false)
{
    if (!isRootItrated)
    {
        var rootDirectoryFiles = Directory.GetFiles(root);
        foreach (var file in rootDirectoryFiles)
        {
            Console.WriteLine(file);
        } 
    }

    var subDirectories = Directory.GetDirectories(root);
    if (subDirectories?.Any() == true)
    {
        foreach (var directory in subDirectories)
        {
            var files = Directory.GetFiles(directory);
            foreach (var file in files)
            {
                Console.WriteLine(file);
            }
            DirectorySearch(directory, true);
        }
    }
}

একটি খুব সহজ সমাধান, ফাইলের একটি তালিকা প্রদান করে।

    public static List<string> AllFilesInFolder(string folder)
    {
        var result = new List<string>();

        foreach (string f in Directory.GetFiles(folder))
        {
            result.Add(f);
        }

        foreach (string d in Directory.GetDirectories(folder))
        {
            result.AddRange(AllFilesInFolder(d));
        }

        return result;
    }

কিছু চমৎকার উত্তর কিন্তু এই উত্তর আমার সমস্যা সমাধান করেনি।

যত তাড়াতাড়ি একটি ফোল্ডার অনুমতি সমস্যা উদ্ভূত হয়: "অনুমতি প্রত্যাখ্যাত" কোড ব্যর্থ হয়। এই "অনুমতি প্রত্যাখ্যাত" সমস্যাটি সম্পর্কে আমি যা পেয়েছি তা হল:

private int counter = 0;

    private string[] MyDirectories = Directory.GetDirectories("C:\\");

    private void ScanButton_Click(object sender, EventArgs e)
    {
        Thread MonitorSpeech = new Thread(() => ScanFiles());
        MonitorSpeech.Start();
    }

    private void ScanFiles()
    {
        string CurrentDirectory = string.Empty;

        while (counter < MyDirectories.Length)
        {
            try
            {
                GetDirectories();
                CurrentDirectory = MyDirectories[counter++];
            }
            catch
            {
                if (!this.IsDisposed)
                {
                    listBox1.Invoke((MethodInvoker)delegate { listBox1.Items.Add("Access Denied to : " + CurrentDirectory); });
                }
            }
        }
    }

    private void GetDirectories()
    {
        foreach (string directory in MyDirectories)
        {
            GetFiles(directory);
        }
    }

    private void GetFiles(string directory)
    {
        try
        {
            foreach (string file in Directory.GetFiles(directory, "*"))
            {
                listBox1.Invoke((MethodInvoker)delegate { listBox1.Items.Add(file); });
            }
        }
        catch
        {
            listBox1.Invoke((MethodInvoker)delegate { listBox1.Items.Add("Access Denied to : " + directory); });
        }
    }

এই অন্যদের সাহায্য করে আশা করি।


ফ্রেমওয়ার্ক 2.0 তে আপনি ব্যবহার করতে পারেন (এটি রুট ফোল্ডারের তালিকা ফাইল, এটি সবচেয়ে জনপ্রিয়তম সেরা উত্তর):

static void DirSearch(string dir)
{
    try
    {
        foreach (string f in Directory.GetFiles(dir))
            Console.WriteLine(f);
        foreach (string d in Directory.GetDirectories(dir))
        {
            Console.WriteLine(d);
            DirSearch(d);
        }

    }
    catch (System.Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

সংক্ষিপ্ত এবং সহজ সমাধান

string dir = @"D:\PATH";

DateTime from_date = DateTime.Now.Date;
DateTime to_date = DateTime.Now.Date.AddHours(23);
var files = Directory.EnumerateFiles(dir, "*.*",SearchOption.AllDirectories).Select(i=>new FileInfo(i))
.Where(file=>file.LastWriteTime >= from_date && file.LastWriteTime <= to_date);
foreach(var fl in files)
    Console.WriteLine(fl.FullName);

হেরাল্ডোরোর উপর ভিত্তি করে এটি আমার কোণে রয়েছে, যদি আপনি কোন নির্দিষ্ট প্যাটার্নের নামের সাথে ফাইলগুলি খুঁজতে চান, যেমন এক্সএমএল ফাইলগুলি যা তাদের নামে কোথাও একটি নির্দিষ্ট স্ট্রিং থাকে তবে:

// call this like so: GetXMLFiles("Platypus", "C:\\");
public static List<string> GetXMLFiles(string fileType, string dir)
{
    string dirName = dir; 
    var fileNames = new List<String>();
    try
    {
        foreach (string f in Directory.GetFiles(dirName))
        {
            if ((f.Contains(fileType)) && (f.Contains(".XML")))
            {
                fileNames.Add(f);
            }
        }
        foreach (string d in Directory.GetDirectories(dirName))
        {
            GetXMLFiles(fileType, d);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    return fileNames;
}

একটি সহজ এবং পরিষ্কার সমাধান

/// <summary>
/// Scans a folder and all of its subfolders recursively, and updates the List of files
/// </summary>
/// <param name="sFullPath">Full path of the folder</param>
/// <param name="files">The list, where the output is expected</param>
internal static void EnumerateFiles(string sFullPath, List<FileInfo> fileInfoList)
{
    try
    {
        DirectoryInfo di = new DirectoryInfo(sFullPath);
        FileInfo[] files = di.GetFiles();

        foreach (FileInfo file in files)
            fileInfoList.Add(file);

        //Scan recursively
        DirectoryInfo[] dirs = di.GetDirectories();
        if (dirs == null || dirs.Length < 1)
            return;
        foreach (DirectoryInfo dir in dirs)
            EnumerateFiles(dir.FullName, fileInfoList);

    }
    catch (Exception ex)
    {
        Logger.Write("Exception in Helper.EnumerateFiles", ex);
    }
}

private void GetFiles(DirectoryInfo dir, ref List<FileInfo> files)
{
    try
    {
        files.AddRange(dir.GetFiles());
        DirectoryInfo[] dirs = dir.GetDirectories();
        foreach (var d in dirs)
        {
            GetFiles(d, ref files);
        }
    }
    catch (Exception e)
    {

    }
}

Directory.GetFiles("C:\\", "*.*", SearchOption.AllDirectories)

IEnumerable<string> GetFilesFromDir(string dir) =>
 Directory.EnumerateFiles(dir).Concat(
 Directory.EnumerateDirectories(dir)
          .SelectMany(subdir => GetFilesFromDir(subdir)));






.net