সি # তে একটি ডিরেক্টরিতে সমস্ত ফাইলকে কীভাবে পুনরাবৃত্তভাবে তালিকাভুক্ত করা যায়?


315

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


1
আপনি কোথায় পপুলেশন করতে চান? যদি গাছ ... এখানে উদাহরণস্বরূপ dreamincode.net/code/snippet 2591.htm
আর্সেন

77
স্ট্রিং [] ফাইলের নামগুলি = ডিরেক্টরি GGetFiles (পাথ, "*", অনুসন্ধানআপনি সমস্ত ডিরেক্টরি)
ব্রুস

আপনি এই প্রশ্নটি দেখতে চাইতে পারেন যেখানে আমি একটি কোড নমুনা উপস্থাপন করেছি যা ট্রিভিউতে ডিরেক্টরি কাঠামো রেন্ডার করতে পুনরাবৃত্তি ব্যবহার করে। যুক্তি বেশিরভাগ ক্ষেত্রে একই হওয়া উচিত।
সেরিব্রাস

5
এটির সাথে সমস্যাটি হ'ল এটি খুব সহজেই ভেঙে যায় যদি আপনার একক ডিরেক্টরিতে অ্যাক্সেস না থাকে: ফলাফল নেই ...
মার্ক গ্র্যাভেল

1
কিছু ফাইল অ্যাক্সেসযোগ্য না হলে আপনি যদি সমস্যায় পড়ে থাকেন তবে গণ্য করা ফাইলগুলি ব্যতিক্রমী গণনা সম্পর্কে
কোডসইনচাউস

উত্তর:


186

এই নিবন্ধটি আপনার প্রয়োজনীয় সমস্ত বিষয় কভার করে। ফাইলগুলি অনুসন্ধান এবং নামগুলির তুলনা করার বিরোধিতা বাদে কেবলমাত্র নামগুলি মুদ্রণ করুন।

এটি এর মতো সংশোধন করা যেতে পারে:

static void DirSearch(string sDir)
{
    try
    {
        foreach (string d in Directory.GetDirectories(sDir))
        {
            foreach (string f in Directory.GetFiles(d))
            {
                Console.WriteLine(f);
            }
            DirSearch(d);
        }
    }
    catch (System.Exception excpt)
    {
        Console.WriteLine(excpt.Message);
    }
}

বারলপ দ্বারা যুক্ত

গোনেল উল্লেখ করেছেন যে উপরের ফাইলগুলি বর্তমান ডিরেক্টরিতে ফাইল তালিকাভুক্ত করে না এবং ফাইল তালিকা অংশটি ডিরেক্টরিগুলির অংশের বাইরে রাখার পরামর্শ দেয়। নিম্নলিখিত এটি করবে। এটিতে একটি রাইটিংলাইন লাইনও রয়েছে যা আপনি আপত্তিহীন করতে পারেন, এটি পুনরাবৃত্তিতে আপনি কোথায় আছেন তা সনাক্ত করতে সহায়তা করে যা পুনরাবৃত্তি কীভাবে কাজ করে তা দেখানোর জন্য কলগুলি প্রদর্শন করতে সহায়তা করতে পারে।

            DirSearch_ex3("c:\\aaa");
            static void DirSearch_ex3(string sDir)
            {
                //Console.WriteLine("DirSearch..(" + sDir + ")");
                try
                {
                    Console.WriteLine(sDir);

                    foreach (string f in Directory.GetFiles(sDir))
                    {
                        Console.WriteLine(f);
                    }

                    foreach (string d in Directory.GetDirectories(sDir))
                    {
                        DirSearch_ex3(d);
                    }
                }
                catch (System.Exception excpt)
                {
                    Console.WriteLine(excpt.Message);
                }
            }

86
এই পদ্ধতিটি প্রাথমিক ডিরেক্টরিতে ফাইলগুলি তালিকাভুক্ত করে না, কেবল এটি সাব ডায়ার এবং কম। আমি গেটফিলগুলি গেটড ডিরেক্টরিগুলির বাইরে চলে যাব
গোনিল

1
কখনও কখনও কেউ প্রাথমিক ডিরেক্টরিতে ফাইল চায় না, এক্ষেত্রে এটি যুক্তিসঙ্গত ছোট কাঠামোর জন্য উপযুক্ত। খুব বড় তালিকার জন্য, মার্ক গ্রাভেলের সমাধানের মতো কিছু ব্যবহার করুন: স্ট্যাকওভারফ্লো.
জোসেফ গ্যাব্রিয়েল

2
@ গনিয়েল সঠিক। ইনপুট রুট ডিরেক্টরিটির ফাইল তালিকা প্রত্যাশা না করা কোনও ব্যবহারকারীের পক্ষে এটি অনেক কম প্রশংসনীয়। শব্দ ইনপুট এখানে মূল। এটি একটি কারণে ইনপুট হয়েছে।
ফ্লোরিন মিরসিয়া

2
আমাকে অভ্যন্তরীণ
ফোরচ লুপটির

3
আপনার ব্যতিক্রম ধরা এড়ানো উচিত - আপনি উদাহরণস্বরূপ কোনও আউটআউফ মেমরিএক্সসেপশন ধরতে চান? আপনি যা পরিচালনা করতে পারেন কেবল তা ধরুন।
অ্যালিস্টায়ার্ট্রি 5:25

435

নোট 4.0.০-তে অন্তর্ভুক্ত রয়েছে (অনুমিতভাবে) পুনরাবৃত্ত-ভিত্তিক (অ্যারে-ভিত্তিক নয়) ফাইল ফাংশন এতে অন্তর্নির্মিত রয়েছে:

foreach (string file in Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories))
{
    Console.WriteLine(file);
}

এই মুহুর্তে আমি নীচের মতো কিছু ব্যবহার করব; ইনবিল্ট রিকার্সিভ পদ্ধতি খুব সহজেই ভেঙে যায় যদি আপনার একক সাব-ডিরের অ্যাক্সেস না থাকে ...; Queue<string>ব্যবহার অত্যধিক কল-স্ট্যাক পুনরাবৃত্তির এড়াতে, এবং পুনরুক্তিকারীর ব্লক আমাদের বিপুল অ্যারের থাকার এড়াতে।

static void Main() {
    foreach (string file in GetFiles(SOME_PATH)) {
        Console.WriteLine(file);
    }
}

static IEnumerable<string> GetFiles(string path) {
    Queue<string> queue = new Queue<string>();
    queue.Enqueue(path);
    while (queue.Count > 0) {
        path = queue.Dequeue();
        try {
            foreach (string subDir in Directory.GetDirectories(path)) {
                queue.Enqueue(subDir);
            }
        }
        catch(Exception ex) {
            Console.Error.WriteLine(ex);
        }
        string[] files = null;
        try {
            files = Directory.GetFiles(path);
        }
        catch (Exception ex) {
            Console.Error.WriteLine(ex);
        }
        if (files != null) {
            for(int i = 0 ; i < files.Length ; i++) {
                yield return files[i];
            }
        }
    }
}

1
@ সান্টোস পুনরাবৃত্তির পুনঃপ্রেরণ বিন্দুতে এনুমারেট ফাইলস আইওএক্সেপশন ছুড়ে ফেলেছে "ফাইলটির নাম সিস্টেম দ্বারা সমাধান করা যায় না"
সার্জ

5
ফাইল এক্সটেনশন ছাড়াই*.* ফাইলগুলিও অন্তর্ভুক্ত রয়েছে কিনা তা জানতে সকলের জন্য : হ্যাঁ, এটি এক মিনিট আগে পরীক্ষিত হয়েছিল।
টোবিয়াস কানৌস

1
এটি ব্যবহার করতে আপনাকে যুক্ত করতে হবেusing System.IO;
মনিকা পুনরায় ইনস্টল

7
@Wikis এবং ব্যবহার করা Consoleআপনি যোগ করতে হবে using System;- কিন্তু যেহেতু আইডিই প্রয়োজনীয় সকল যোগ করতে পারেন usingনির্দেশনা তোমার জন্য , আর যেহেতু আমরা এখানে কিছু বহিরাগত ব্যবহার করছেন না, এটা খুবই সাধারণ তাদের অন্তর্ভুক্ত না করতে (Ctrl +।)। হেক, আপনার একটি classসংজ্ঞা ইত্যাদির
দরকারও আছে

1
@ মার্কগ্রাভেল আমরা এখন নেট নেট এবং ভিজ্যুয়াল স্টুডিও কোড বিশ্বে রয়েছি, সুতরাং বিবৃতি ব্যবহার সহ যে কোনও উদাহরণে সর্বদা স্বাগত। সিরিজ অনুসন্ধান এবং অর্থহীন "ইয়াক শেভিং" র সংরক্ষণের নেট কোড
জোনসি

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

2
লগইন ব্যবহারকারীর কিছু ফোল্ডারে অ্যাক্সেস না থাকলে কীভাবে ত্রুটি এড়ানো যায়।
রোমিল কুমার জৈন

5
@ রোমিল আমি বিশ্বাস করি না যে এই কোড স্নিপেট সম্পূর্ণ কার্যকারিতা ইঙ্গিত করার চেষ্টা করছে, কেবল অপিটিভ অপরিশোধিত কার্যকারিতা যা অনুসন্ধান করেছিল। ভাগ করে নেওয়ার জন্য ধন্যবাদ, পেসকুমা!
kayleeFrye_onDeck

@ কেলিফ্রি_অনডেক, ফাইলগুলি পাওয়ার সময় যদি কোনও ফোল্ডারের জন্য উত্থাপিত হয় তবে আমি কেবলমাত্র উদ্বেগ প্রকাশ করেছি। এই উদ্বেগের কারণে আমরা আমাদের কাস্টম রিকার্সিভ ফাংশনটি বাস্তবায়ন করি।
রোমিল কুমার জৈন

3
আপনি এই সমাধানটির সাথে "অননুমোদিতঅ্যাক্সেস এক্সেপশন" পাবেন। আপনার এমন একটি সমাধান থাকা উচিত যা এইরকম ত্রুটিগুলি পরিচালনা করতে পারে।
কাইরান

13

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

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;
    }
}

এটি ব্যবহার করুন:

var list = GetAllFiles(mask, (info) => Path.GetExtension(info.Name) == ".html").ToList();

এটি কোনও ক্ষেত্রে হ্যান্ডেল করে না যেখানে আপনার খালি ডিরেক্টরি রয়েছে ... ফাংশনের ভিতরে কোনও রিটার্ন বিবৃতি নেই।
ফ্রুমকিনডব্লিউওয়াই

@ ফ্রামকিনওয়াইওয়াই খালি ডিরেক্টরিতে কী ঘটে? এখনই এটি পরীক্ষা করার জন্য আমার কাছে কোনও মেশিন হাতে নেই।
জন কাস্টার


3

ফ্রেমওয়ার্ক 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);
    }
}

3

কিছু দুর্দান্ত উত্তর কিন্তু এই উত্তরগুলি আমার সমস্যার সমাধান করেনি।

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

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); });
        }
    }

আশা করি এটি অন্যকে সহায়তা করবে।


3

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

/// <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);
    }
}

3
ডাইরেক্টরিআইনফো.গেটফায়ার্স () আপনাকে বাক্সের বাইরে যা করবে তা ম্যানুয়ালি করছেন - কেবলমাত্র অনুসন্ধান-অপশন.অলডাইরেক্টরিজের সাহায্যে ওভারলোডটি ব্যবহার করুন এবং এটি সমস্ত নিজস্বভাবে পুনরাবৃত্তি করবে। সুতরাং এটি একটি জটিল সমাধান।
ফিলিপ

2

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

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

        string searchPattern = "*.xml";

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

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

        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();

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


1
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)
    {

    }
}

1
কেন প্যারামিটার filesহয় ref? দরকার নেই.
ম্যাসিমিলিয়ানো ক্রাউস

@ মাসিমিলিয়ানো ক্রাউস আমি যুক্তি দিয়েছি যে, প্রয়োজন না হওয়ার পরে এটি আরও পরিষ্কার করে দেয় যে তার পদ্ধতিটি পরিবর্তিত হবে filesএবং আপনি কেবলমাত্র new List<FileInfo>()প্যারামিটার হিসাবে আর দিতে পারবেন না যা অকেজো হবে। কিছু উপ-অপ্টিমাইজেশনের জন্য অনুমতি দেয় এবং প্রয়োজন না হলে একটি নতুন অবজেক্ট তৈরি করা এড়াতে পারে।
জেরোমেজ

@ জেরোজেজে যদি আপনি জানতে পারেন ওওপি কী, আপনি জানেন যে আপনি যখনই কোনও পদ্ধতিতে কোনও বস্তু পাস করেন, সেই পদ্ধতিটি বস্তুর বৈশিষ্ট্য / ক্ষেত্রগুলিকে পরিবর্তন করতে পারে। সুতরাং refকিছু পরিষ্কার করে না। refএর উদ্দেশ্য পুরো পরিবর্তন হয় filesএটি একটি বিপজ্জনক অপারেশন এবং এখানে যে জন্য কোন প্রয়োজন নেই: আপনি শুধু তালিকা পূরণ করতে পারেন, আপনি এটি আরেকটি তালিকা পুনরায় বিন্দু প্রয়োজন হবে না এমনকি পদ্ধতি এর কলার জন্য পয়েন্টার গাদা refশুধুমাত্র খুব বিশেষ ক্ষেত্রে ব্যবহার করা উচিত; বেশিরভাগ সময় আপনাকে আরও কার্যকরভাবে দৃষ্টান্তমূলক উপায়ে জিনিসগুলি প্রয়োগ করতে হবে।
ম্যাসিমিলিয়ানো ক্রাউস

1

এড়াতে UnauthorizedAccessException, আমি ব্যবহার করি:

var files = GetFiles(@"C:\", "*.*", SearchOption.AllDirectories);
foreach (var file in files)
{
    Console.WriteLine($"{file}");
}

public static IEnumerable<string> GetFiles(string path, string searchPattern, SearchOption searchOption)
{
    var foldersToProcess = new List<string>()
    {
        path
    };

    while (foldersToProcess.Count > 0)
    {
        string folder = foldersToProcess[0];
        foldersToProcess.RemoveAt(0);

        if (searchOption.HasFlag(SearchOption.AllDirectories))
        {
            //get subfolders
            try
            {
                var subfolders = Directory.GetDirectories(folder);
                foldersToProcess.AddRange(subfolders);
            }
            catch (Exception ex)
            {
                //log if you're interested
            }
        }

        //get files
        var files = new List<string>();
        try
        {
            files = Directory.GetFiles(folder, searchPattern, SearchOption.TopDirectoryOnly).ToList();
        }
        catch (Exception ex)
        {
            //log if you're interested
        }

        foreach (var file in files)
        {
            yield return file;
        }
    }
}

1

আপনার যদি কেবল ফাইলের নাম প্রয়োজন হয় এবং যেহেতু আমি এখানে বেশিরভাগ সমাধান পছন্দ করি না (বৈশিষ্ট্য অনুসারে বা পাঠযোগ্যতা বুদ্ধিমান), তবে এই অলসতা সম্পর্কে কীভাবে?

private void Foo()
{
  var files = GetAllFiles("pathToADirectory");
  foreach (string file in files)
  {
      // Use can use Path.GetFileName() or similar to extract just the filename if needed
      // You can break early and it won't still browse your whole disk since it's a lazy one
  }
}

/// <exception cref="T:System.IO.DirectoryNotFoundException">The specified path is invalid (for example, it is on an unmapped drive).</exception>
/// <exception cref="T:System.UnauthorizedAccessException">The caller does not have the required permission.</exception>
/// <exception cref="T:System.IO.IOException"><paramref name="path" /> is a file name.-or-A network error has occurred.</exception>
/// <exception cref="T:System.IO.PathTooLongException">The specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must be less than 248 characters and file names must be less than 260 characters.</exception>
/// <exception cref="T:System.ArgumentNullException"><paramref name="path" /> is null.</exception>
/// <exception cref="T:System.ArgumentException"><paramref name="path" /> is a zero-length string, contains only white space, or contains one or more invalid characters as defined by <see cref="F:System.IO.Path.InvalidPathChars" />.</exception>
[NotNull]
public static IEnumerable<string> GetAllFiles([NotNull] string directory)
{
  foreach (string file in Directory.GetFiles(directory))
  {
    yield return file; // includes the path
  }

  foreach (string subDir in Directory.GetDirectories(directory))
  {
    foreach (string subFile in GetAllFiles(subDir))
    {
      yield return subFile;
    }
  }
}


0

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

// 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;
}

0

মডেল, কাস্টম বাস্তবায়ন ফাইল এবং ফোল্ডার তালিকাভুক্ত।
এটি আপনার সূচনা ডিরেক্টরি থেকে শুরু করে সমস্ত ফাইল এবং ফোল্ডারগুলির একটি সম্পূর্ণ তালিকা তৈরি করে।

public class DirOrFileModel
    {
        #region Private Members

        private string _name;
        private string _location;
        private EntryType _entryType;

        #endregion

        #region Bindings

        public string Name
        {
            get { return _name; }
            set
            {
                if (value == _name) return;
                _name = value;
            }
        }

        public string Location
        {
            get { return _location; }
            set
            {
                if (value == _location) return;
                _location = value;
            }
        }

        public EntryType EntryType
        {
            get { return _entryType; }
            set
            {
                if (value == _entryType) return;
                _entryType = value;
            }
        }

        public ObservableCollection<DirOrFileModel> Entries { get; set; }

        #endregion

        #region Constructor

        public DirOrFileModel()
        {
            Entries = new ObservableCollection<DirOrFileModel>();
        }

        #endregion
    }

    public enum EntryType
    {
        Directory = 0,
        File = 1
    }

পদ্ধতি:

 static DirOrFileModel DirSearch(DirOrFileModel startDir)
        {
            var currentDir = startDir;
            try
            {
                foreach (string d in Directory.GetDirectories(currentDir.Location))
                {
                    var newDir = new DirOrFileModel
                    {
                        EntryType = EntryType.Directory,
                        Location = d,
                        Name = Path.GetFileName(d)
                    };
                    currentDir.Entries.Add(newDir);

                    DirSearch(newDir);
                }

                foreach (string f in Directory.GetFiles(currentDir.Location))
                {
                    var newFile = new DirOrFileModel
                    {
                        EntryType = EntryType.File,
                        Location = f,
                        Name = Path.GetFileNameWithoutExtension(f)
                    };
                    currentDir.Entries.Add(newFile);
                }

            }
            catch (Exception excpt)
            {
                Console.WriteLine(excpt.Message);
            }
            return startDir;
        }

ব্যবহার:

var dir = new DirOrFileModel
            {
                Name = "C",
                Location = @"C:\",
                EntryType = EntryType.Directory
            };

            dir = DirSearch(dir);

0

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

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);

0

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

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);
        }
    }
}


0

ডিরেক্টরিতে নিচে যাওয়ার জন্য সর্বাধিক lvl সহ কিছু উন্নত সংস্করণ এবং ফোল্ডারগুলি বাদ দেওয়ার বিকল্প:

using System;
using System.IO;

class MainClass {
  public static void Main (string[] args) {

    var dir = @"C:\directory\to\print";
    PrintDirectoryTree(dir, 2, new string[] {"folder3"});
  }


  public static void PrintDirectoryTree(string directory, int lvl, string[] excludedFolders = null, string lvlSeperator = "")
  {
    excludedFolders = excludedFolders ?? new string[0];

    foreach (string f in Directory.GetFiles(directory))
    {
        Console.WriteLine(lvlSeperator+Path.GetFileName(f));
    } 

    foreach (string d in Directory.GetDirectories(directory))
    {
        Console.WriteLine(lvlSeperator + "-" + Path.GetFileName(d));

        if(lvl > 0 && Array.IndexOf(excludedFolders, Path.GetFileName(d)) < 0)
        {
          PrintDirectoryTree(d, lvl-1, excludedFolders, lvlSeperator+"  ");
        }
    }
  }
}

ইনপুট ডিরেক্টরি:

-folder1
  file1.txt
  -folder2
    file2.txt
    -folder5
      file6.txt
  -folder3
    file3.txt
  -folder4
    file4.txt
    file5.txt

ফাংশনটির আউটপুট (lvl সীমাবদ্ধতার কারণে ফোল্ডার 5 এর সামগ্রী বাদ দেওয়া হয়েছে এবং ফোল্ডার 3 এর সামগ্রী বাদ দেওয়া হয়েছে কারণ এটি ফোল্ডার অ্যারেতে রয়েছে):

-folder1
  file1.txt
  -folder2
    file2.txt
    -folder5
  -folder3
  -folder4
    file4.txt
    file5.txt

-1

এখানে বি ক্লে শ্যাননের কোড এক্সেল-ফাইলে স্থির নয় এমন একটি সংস্করণ রয়েছে:

class ExcelSearcher
{
    private List<string> _fileNames;

    public ExcelSearcher(List<string> filenames)
    {
        _fileNames = filenames;
    }
    public List<string> GetExcelFiles(string dir, List<string> filenames = null)
    {

        string dirName = dir;
        var dirNames = new List<string>();
        if (filenames != null)
        {
            _fileNames.Concat(filenames);
        }
        try
        {
            foreach (string f in Directory.GetFiles(dirName))
            {
                if (f.ToLower().EndsWith(".xls") || f.ToLower().EndsWith(".xlsx"))
                {
                    _fileNames.Add(f);
                }
            }
            dirNames = Directory.GetDirectories(dirName).ToList();
            foreach (string d in dirNames)
            {
                GetExcelFiles(d, _fileNames);
            }
        }
        catch (Exception ex)
        {
            //Bam
        }
        return _fileNames;
    }

-1

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

    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;
    }

-2
static void Main(string[] args)
        {
            string[] array1 = Directory.GetFiles(@"D:\");
            string[] array2 = System.IO.Directory.GetDirectories(@"D:\");
            Console.WriteLine("--- Files: ---");
            foreach (string name in array1)
            {
                Console.WriteLine(name);
            }
            foreach (string name in array2)
            {
                Console.WriteLine(name);
            }
                  Console.ReadLine();
        }

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.