ডিরেক্টরি + উপ ডিরেক্টরিতে সমস্ত ফাইল এবং ডিরেক্টরি তালিকাবদ্ধ করুন


109

আমি সেই ডিরেক্টরিতে থাকা ডিরেক্টরি এবং উপ ডিরেক্টরিতে অন্তর্ভুক্ত প্রতিটি ফাইল এবং ডিরেক্টরি তালিকাবদ্ধ করতে চাই। আমি যদি সি: the ডিরেক্টরি হিসাবে বেছে নিই, প্রোগ্রামটি যে ড্রাইভটিতে অ্যাক্সেস করেছিল তাতে প্রতিটি ফাইল এবং ফোল্ডারের প্রতিটি নাম পেত।

একটি তালিকা হতে পারে

FD \ 1.txt
FD \ 2.txt
FD \ একটি \
FD \ b হল \
FD \ একটি \ 1.txt
FD \ একটি \ 2.txt
FD \ একটি \ একটি \
FD \ একটি \ b হল \
FD \ b হল \ 1.txt
FD \ b হল \ 2.txt
FD \ b হল \ একটি
FD \ b হল \ b হল
FD \ একটি \ একটি \ 1.txt
FD \ একটি \ একটি \ একটি \
FD \ একটি \ b হল \ 1.txt
FD \ একটি \ b হল \ একটি
FD \ b হল \ একটি \ 1.txt
FD \ b হল \ একটি \ একটি \
FD \ b হল \ b হল \ 1.txt
FD \ b হল \ b হল \ একটি

আপনার ব্রাউজ করুন ক্লাস এবং পদ্ধতিগুলির জন্য সিস্টেম.আইও নেমস্পেস ।
Lucero

পরীক্ষা করে দেখুন এই প্রশ্নের আর অংশ যেখানে তিনি নকশার সাথে মেলে এমন ড্রপ।
ডেসব্লিংকনলাইট

উত্তর:


192
string[] allfiles = Directory.GetFiles("path/to/dir", "*.*", SearchOption.AllDirectories);

যেখানে *.*ফাইলের সাথে মেলে প্যাটার্ন where

ডিরেক্টরি যদি প্রয়োজন হয় তবে আপনি এটির মতো যেতে পারেন:

 foreach (var file in allfiles){
     FileInfo info = new FileInfo(file);
 // Do something with the Folder or just add them to a list via nameoflist.add();
 }

1
সত্যিই কাজ করবে না ... Lsit<>ক্লাস? গেটফাইলস কী ফিরিয়ে দেয়? এবং যে ডিরেক্টরিগুলির নামও অনুরোধ করা হয়েছিল সেগুলি সম্পর্কে কী?
Lucero

1
GetFilesপদ্ধতি একটি স্ট্রিং বিন্যাস দেখায়।
গুফা

সত্যিকার অর্থে ... আপনি ঠিক বলেছেন ... আমি 2 দিন আগে Qt অ্যাবআউট শিখছি এবং কিছুটা ভুল হয়েছিল
রুসলান এফ।

এটি হয়ত কাজ করতে পারে তবে এটি প্রায়শই একটি অননুমোদিত অ্যাক্সেসএক্সসেপশন নিয়ে ব্যর্থ হয়। এটি কীভাবে কেবল ডিরেক্টরিগুলি অ্যাক্সেস করতে পারে তা অনুসন্ধান করবে?
derp_in_mouth

এর অর্থ হল যে আপনার সিস্টেমে এই অ্যাপ্লিকেশনটির পর্যাপ্ত অনুমতি নেই
রুসলান এফ।

50

Directory.GetFileSystemEntries.NET 4.0+ এ বিদ্যমান এবং ফাইল এবং ডিরেক্টরি উভয়ই প্রদান করে। এটি যেমন কল:

string[] entries = Directory.GetFileSystemEntries(path, "*", SearchOption.AllDirectories);

মনে রাখবেন যে এটি আপনার উপ-ডিরেক্টরিতে অ্যাক্সেস নেই এমন উপ-ডিরেক্টরিগুলির লিস্টের প্রচেষ্টাগুলি মোকাবেলা করবে না (তবে এটি আপনার প্রয়োজনের জন্য যথেষ্ট)।


3
এটি এখানকার সেরা উত্তর। এটি কোডের এক লাইনে সমস্ত ফাইল এবং ফোল্ডার পায়, যা অন্যরা কেউই করে না।
স্টিভ স্মিথ

15

ফোল্ডার এবং ফাইলগুলি পাওয়ার জন্য GetDirectoriesএবং GetFilesপদ্ধতিগুলি ব্যবহার করুন ।

সাব-ফোল্ডারে ফোল্ডার এবং ফাইলগুলি পেতে ব্যবহার করুন ।SearchOption AllDirectories


নামের বাম অংশটি কাটাতে সাবস্ট্রিং ব্যবহার করুন । :)
Lucero

@ লুসেরো কিভাবে এবং কেন আপনি তা করবেন? Pathআরও নির্ভরযোগ্য পদ্ধতি প্রস্তাব।
গুসডোর

@ গুডোর Pathপথের একটি নির্দিষ্ট বাম অংশ মুছে ফেলার জন্য আরও উপযুক্ত উপায়ে নির্দ্বিধায় নির্দ্বিধায় অনুভব করুন , যেমন example C: `প্রদত্ত উদাহরণে।
Lucero

@ লুসেরো আমার মন্তব্যটি খারাপভাবে লেখা হয়নি। 'সাবস্ট্রিং ব্যবহার করুন' আমাকে অনেক কিছু জানায় না এবং একটি দুর্দান্ত সমাধান পেতে আমাকে লিনকপ্যাডে আটকে যেতে হয়েছিল। উদাহরণস্বরূপ, পরামিতিটি কী হবে? আপনি কি path.SubString(2)নির্লিপ্তভাবে ড্রাইভের চিঠি এবং কোলন মুছে ফেলতে যাচ্ছেন ? ডিরেক্টরি যদি একটি নেটওয়ার্ক শেয়ার হয়? আমি Pathএকটি নির্ভরযোগ্য পদ্ধতি হিসাবে পরামর্শ দিচ্ছি কারণ এটি এই অঞ্চলে প্রচুর পরিমাণে গুডি সরবরাহ করতে পারে। এই ক্ষেত্রে, আপনি লিখতে পারেন filePath.Substring(Path.GetPathRoot(filePath).Length)। হ্যাঁ এটি সাবস্ট্রিং ব্যবহার করে কারণ এটি সবচেয়ে সংক্ষিপ্ত।
গুসডোর

10
public static void DirectorySearch(string dir)
{
    try
    {
        foreach (string f in Directory.GetFiles(dir))
        {
            Console.WriteLine(Path.GetFileName(f));
        }
        foreach (string d in Directory.GetDirectories(dir))
        {
            Console.WriteLine(Path.GetFileName(d));
            DirectorySearch(d);
        }
    }
    catch (System.Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

3
কোডটি কী করে তার একটি সামান্য ব্যাখ্যা যোগ করতে পারলে এটি আপনার উত্তরটির উন্নতি করবে।
অ্যালেক্স

এটি ডিরেক্টরিতে পুনরাবৃত্তভাবে যায় এবং ফাইলের নাম বা ডিরেক্টরি নাম মুদ্রণ করে। প্রতিটি অভ্যন্তরীণ ডিরেক্টরিতে এটি একই ফাংশনটিকে কল করে। : আরও তথ্যের জন্য stackoverflow.com/questions/929276/...
I.Step

3

আমি ভীত, GetFilesপদ্ধতিটি ফাইলগুলির তালিকা দেয় তবে ডিরেক্টরিগুলি নয়। প্রশ্নের তালিকা আমাকে অনুরোধ করে যে ফলাফলটি ফোল্ডারগুলির পাশাপাশি অন্তর্ভুক্ত করা উচিত। আপনি যদি আরও কাস্টমাইজড তালিকা চান তবে আপনি কল GetFilesএবং GetDirectoriesপুনরাবৃত্তির চেষ্টা করতে পারেন । এটা চেষ্টা কর:

List<string> AllFiles = new List<string>();
void ParsePath(string path)
{
    string[] SubDirs = Directory.GetDirectories(path);
    AllFiles.AddRange(SubDirs);
    AllFiles.AddRange(Directory.GetFiles(path));
    foreach (string subdir in SubDirs)
        ParsePath(subdir);
}

টিপ: আপনার যদি কোনও নির্দিষ্ট বৈশিষ্ট্য পরীক্ষা করতে হয় তবে আপনি ব্যবহার করতে পারেন FileInfoএবং DirectoryInfoক্লাস করতে পারেন ।


1

আপনি ফাইন্ডফার্সফাইলে ব্যবহার করতে পারেন যা একটি হ্যান্ডেল ফেরত দেয় এবং তারপরে ফাংশনকে ফাংশনকে পুনরাবৃত্তভাবে কল করতে পারে d এটি একটি ভাল শ্রুতিমধুর বিষয় কারণ কাঠামোগুলি বিভিন্ন নাম যেমন যেমন বিকল্পনাম, লাস্টমেট্রিক্রিয়েটেড, সংশোধিত, বৈশিষ্ট্য ইত্যাদিতে পূর্ণ হবে would

আপনি যখন নেট ফ্রেমওয়ার্ক ব্যবহার করেন, আপনাকে নিয়ন্ত্রণহীন জায়গায় প্রবেশ করতে হবে।


1

ডিরেক্টরিতে নীচে যেতে ফোল্ডারগুলি বাদ দেওয়ার বিকল্পের জন্য সর্বাধিক 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

0

ডিরেক্টরি গাছের অভ্যন্তরে যদি আপনার সাবফোল্ডারে অ্যাক্সেস না থাকে তবে ডিরেক্টরি.গেটফায়ালগুলি ব্যতিক্রমটি থামায় এবং ছুঁড়ে দেয় ফলে প্রাপ্ত স্ট্রিংয়ের নাল মান হয় [] value

এখানে, এই উত্তরটি https://stackoverflow.com/a/38959208/6310707 দেখুন

এটি লুপের মধ্যে ব্যতিক্রম পরিচালনা করে এবং পুরো ফোল্ডারটি অবিচলিত অবধি কাজ চালিয়ে যায়।


0

যৌক্তিক এবং আদেশযুক্ত উপায়:

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;

namespace DirLister
{
class Program
{
    public static void Main(string[] args)
    {
        //with reflection I get the directory from where this program is running, thus listing all files from there and all subdirectories
        string[] st = FindFileDir(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));
        using ( StreamWriter sw = new StreamWriter("listing.txt", false ) )
        {
            foreach(string s in st)
            {
                //I write what I found in a text file
                sw.WriteLine(s);
            }
        }
    }

    private static string[] FindFileDir(string beginpath)
    {
        List<string> findlist = new List<string>();

        /* I begin a recursion, following the order:
         * - Insert all the files in the current directory with the recursion
         * - Insert all subdirectories in the list and rebegin the recursion from there until the end
         */
        RecurseFind( beginpath, findlist );

        return findlist.ToArray();
    }

    private static void RecurseFind( string path, List<string> list )
    {
        string[] fl = Directory.GetFiles(path);
        string[] dl = Directory.GetDirectories(path);
        if ( fl.Length>0 || dl.Length>0 )
        {
            //I begin with the files, and store all of them in the list
            foreach(string s in fl)
                list.Add(s);
            //I then add the directory and recurse that directory, the process will repeat until there are no more files and directories to recurse
            foreach(string s in dl)
            {
                list.Add(s);
                RecurseFind(s, list);
            }
        }
    }
}
}

আপনি দয়া করে একটি ব্যাখ্যা বা ইন-লাইন মন্তব্য প্রদান করতে পারেন, আপনার কোডটি কী করে?
মার্থিম

অবশ্যই, এটি সম্পন্ন করেছেন, তবে এটি স্ব-বর্ণনামূলক হওয়া উচিত, এটি সমস্ত ডিরেক্টরি এবং ফাইলগুলির মাধ্যমে একটি সরল লুপিং পুনরাবৃত্তি
সাসাচ

0

নিম্নলিখিত উদাহরণটি দ্রুততম একটি ট্রি ট্রি হ্যান্ডলিং ব্যতিক্রমগুলির (সমান্তরাল নয়) উপায় ফাইল এবং উপ-ফোল্ডারগুলির তালিকা করে। ডিরেক্টরিটি ব্যবহার করা আরও দ্রুত হবে Search সমস্ত ডিরেক্টরি গণনা করার জন্য অনুসন্ধানঅপশন.অলডাইরেক্টরিগুলি ব্যবহার করে সূচনা ডিরেক্টরিগুলি, তবে এই পদ্ধতিটি যদি কোনও অননুমোদিতঅ্যাক্সেসএক্সসেপশন বা পাথটুলংএক্সসেপশনকে আঘাত করে তবে ব্যর্থ হবে।

জেনেরিক স্ট্যাক সংগ্রহের ধরণ ব্যবহার করে, যা প্রথম আউট (LIFO) স্ট্যাকের সর্বশেষ এবং পুনরাবৃত্তি ব্যবহার করে না। Https://msdn.microsoft.com/en-us/library/bb513869.aspx থেকে , আপনাকে সমস্ত উপ-ডিরেক্টরি এবং ফাইলগুলি গণনা করতে এবং সেই ব্যতিক্রমগুলির সাথে কার্যকরভাবে ডিল করতে সহায়তা করে।

    public class StackBasedIteration
{
    static void Main(string[] args)
    {
        // Specify the starting folder on the command line, or in 
        // Visual Studio in the Project > Properties > Debug pane.
        TraverseTree(args[0]);

        Console.WriteLine("Press any key");
        Console.ReadKey();
    }

    public static void TraverseTree(string root)
    {
        // Data structure to hold names of subfolders to be
        // examined for files.
        Stack<string> dirs = new Stack<string>(20);

        if (!System.IO.Directory.Exists(root))
        {
            throw new ArgumentException();
        }
        dirs.Push(root);

        while (dirs.Count > 0)
        {
            string currentDir = dirs.Pop();
            string[] subDirs;
            try
            {
                subDirs = System.IO.Directory.EnumerateDirectories(currentDir); //TopDirectoryOnly
            }
            // An UnauthorizedAccessException exception will be thrown if we do not have
            // discovery permission on a folder or file. It may or may not be acceptable 
            // to ignore the exception and continue enumerating the remaining files and 
            // folders. It is also possible (but unlikely) that a DirectoryNotFound exception 
            // will be raised. This will happen if currentDir has been deleted by
            // another application or thread after our call to Directory.Exists. The 
            // choice of which exceptions to catch depends entirely on the specific task 
            // you are intending to perform and also on how much you know with certainty 
            // about the systems on which this code will run.
            catch (UnauthorizedAccessException e)
            {                    
                Console.WriteLine(e.Message);
                continue;
            }
            catch (System.IO.DirectoryNotFoundException e)
            {
                Console.WriteLine(e.Message);
                continue;
            }

            string[] files = null;
            try
            {
                files = System.IO.Directory.EnumerateFiles(currentDir);
            }

            catch (UnauthorizedAccessException e)
            {

                Console.WriteLine(e.Message);
                continue;
            }

            catch (System.IO.DirectoryNotFoundException e)
            {
                Console.WriteLine(e.Message);
                continue;
            }
            // Perform the required action on each file here.
            // Modify this block to perform your required task.
            foreach (string file in files)
            {
                try
                {
                    // Perform whatever action is required in your scenario.
                    System.IO.FileInfo fi = new System.IO.FileInfo(file);
                    Console.WriteLine("{0}: {1}, {2}", fi.Name, fi.Length, fi.CreationTime);
                }
                catch (System.IO.FileNotFoundException e)
                {
                    // If file was deleted by a separate application
                    //  or thread since the call to TraverseTree()
                    // then just continue.
                    Console.WriteLine(e.Message);
                    continue;
                }
                catch (UnauthorizedAccessException e)
                {                    
                    Console.WriteLine(e.Message);
                    continue;
                }
            }

            // Push the subdirectories onto the stack for traversal.
            // This could also be done before handing the files.
            foreach (string str in subDirs)
                dirs.Push(str);
        }
    }
}

বিশাল সংখ্যক ফাইল এবং ডিরেক্টরিগুলির জন্য টাস্ক ব্যবহার করছেন?
প্রিগ্যান্টকোজোনিরো ক্যাব্রন

এমএসডিএন.মাইক্রোসফট.এইন.উস / লিবারি / raryফ 477033 ( v=vs.110 ) .aspx একটি স্ট্যাক সংগ্রহ এবং দ্রুত ব্যবহার করে উপরের সমাধানটির সমান্তরাল থ্রেডিং সংস্করণ।
মার্কাস

0

আমি নীচের কোডটি এমন একটি ফর্ম সহ ব্যবহার করব যাতে 2 টি বোতাম রয়েছে, একটি প্রস্থান করার জন্য এবং অন্যটি শুরু করার জন্য। একটি ফোল্ডার ব্রাউজার ডায়ালগ এবং একটি সেভ ফাইল ডায়ালগ। কোডটি নীচে তালিকাবদ্ধ রয়েছে এবং আমার সিস্টেমে উইন্ডোজ 10 (64) এ কাজ করে:

using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Directory_List
{

    public partial class Form1 : Form
    {
        public string MyPath = "";
        public string MyFileName = "";
        public string str = "";

        public Form1()
        {
            InitializeComponent();
        }    
        private void cmdQuit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }    
        private void cmdGetDirectory_Click(object sender, EventArgs e)
        {
            folderBrowserDialog1.ShowDialog();
            MyPath = folderBrowserDialog1.SelectedPath;    
            saveFileDialog1.ShowDialog();
            MyFileName = saveFileDialog1.FileName;    
            str = "Folder = " + MyPath + "\r\n\r\n\r\n";    
            DirectorySearch(MyPath);    
            var result = MessageBox.Show("Directory saved to Disk!", "", MessageBoxButtons.OK);
                Application.Exit();    
        }    
        public void DirectorySearch(string dir)
        {
                try
            {
                foreach (string f in Directory.GetFiles(dir))
                {
                    str = str + dir + "\\" + (Path.GetFileName(f)) + "\r\n";
                }    
                foreach (string d in Directory.GetDirectories(dir, "*"))
                {

                    DirectorySearch(d);
                }
                        System.IO.File.WriteAllText(MyFileName, str);

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

-1
using System.IO;
using System.Text;
string[] filePaths = Directory.GetFiles(@"path", "*.*", SearchOption.AllDirectories);

আপনার উত্তর ইতিমধ্যে বিদ্যমান শীর্ষ ভোটের উত্তরে নতুন কিছু যুক্ত করে না।
ডিফল্ট লোকেল

1
এটিও ভুল, কারণ এটি কোনও ডিরেক্টরি ফেরত দেয় না (যেমন প্রশ্নটি নির্দিষ্ট করা হয়েছে), কেবল আসল ফাইলগুলি।
অ্যালাস্টার মাউ

-1

একটি ছোট্ট সহজ এবং ধীরে ধীরে কিন্তু কাজ !! আপনি যদি কোনও ফাইলপথ না দেন তবে প্রাথমিকভাবে "ফিক্সপথ" ব্যবহার করুন এটি ঠিক উদাহরণ .... আপনি যা চান তা সঠিক ফাইলটি টাইপ করতে পারেন, আমি তালিকার নামটি বেছে নেওয়ার সময় আমি একটি ভুল করেছি কারণ "অস্থায়ী ফাইললিস্ট অনুসন্ধান ফাইলগুলির তালিকা" সুতরাং এটি চালিয়ে যান .... এবং "ত্রুটি তালিকা" নিজেই কথা বলে

 static public void Search(string path, string fileType, List<string> temporaryFileList, List<string> errorList)
    {

        List<string> temporaryDirectories = new List<string>();

        //string fix = @"C:\Users\" + Environment.UserName + @"\";
        string fix = @"C:\";
        string folders = "";
        //Alap útvonal megadása 
        if (path.Length != 0)
        { folders = path; }
        else { path = fix; }

        int j = 0;
        int equals = 0;
        bool end = true;

        do
        {

            equals = j;
            int k = 0;

            try
            {

                int foldersNumber = 
                Directory.GetDirectories(folders).Count();
                int fileNumber = Directory.GetFiles(folders).Count();

                if ((foldersNumber != 0 || fileNumber != 0) && equals == j)
                {

                    for (int i = k; k < 
                    Directory.GetDirectories(folders).Length;)
                    {

             temporaryDirectories.Add(Directory.GetDirectories(folders)[k]);
                        k++;
                    }

                    if (temporaryDirectories.Count == j)
                    {
                        end = false;
                        break;
                    }
                    foreach (string files in Directory.GetFiles(folders))
                    {
                        if (files != string.Empty)
                        {
                            if (fileType.Length == 0)
                            {
                                temporaryDirectories.Add(files);
                            }
                            else
                            {

                                if (files.Contains(fileType))
                                {
                                    temporaryDirectories.Add(files);

                                }
                            }
                        }
                        else
                        {
                            break;
                        }
                    }

                }

                equals++;

                for (int i = j; i < temporaryDirectories.Count;)
                {
                    folders = temporaryDirectories[i];
                    j++;
                    break;
                }

            }
            catch (Exception ex)
            {
                errorList.Add(folders);

                for (int i = j; i < temporaryDirectories.Count;)
                {
                    folders = temporaryDirectories[i];
                    j++;
                    break;
                }
            }
        } while (end);
    }

-1

স্ট্রিংয়ের তালিকা তৈরি করুন

    public static List<string> HTMLFiles = new List<string>();

 private void Form1_Load(object sender, EventArgs e)
        {

     HTMLFiles.AddRange(Directory.GetFiles(@"C:\DataBase", "*.txt"));
            foreach (var item in HTMLFiles)
            {
                MessageBox.Show(item);
            }

}

এটি উপ ডিরেক্টরিগুলি পায় না।
পরিশ্রম দেড়

-1

dir / s / b > results.txt

/ s = সাবফোল্ডার / বি = বিয়ার ফলাফল

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