web-dev-qa-db-ja.com

リストを返すフォルダーおよびサブフォルダー内のすべてのファイルを取得するメソッド

フォルダーとそのすべてのサブフォルダーを反復処理し、ファイルパスのリストを取得するメソッドがあります。しかし、私はそれを作成してファイルをパブリックリストに追加する方法しか理解できず、リストを返す方法は理解できませんでした。メソッドは次のとおりです。

public List<String> files = new List<String>();

private void DirSearch(string sDir)
    {
        try
        {
            foreach (string f in Directory.GetFiles(sDir))
            {
                files.Add(f);
            }
            foreach (string d in Directory.GetDirectories(sDir))
            {
                DirSearch(d);
            }
        }
        catch (System.Exception excpt)
        {
            MessageBox.Show(excpt.Message);
        }
    }

そのため、コードのある時点でDirSearch()を呼び出すだけで、リストにパスが「入力」されますが、それを複数回使用して、異なるディレクトリなどで異なるリストを作成できるようにしたいのです。

43
Wilson
private List<String> DirSearch(string sDir)
{
    List<String> files = new List<String>();
    try
    {
        foreach (string f in Directory.GetFiles(sDir))
        {
            files.Add(f);
        }
        foreach (string d in Directory.GetDirectories(sDir))
        {
            files.AddRange(DirSearch(d));
        }
    }
    catch (System.Exception excpt)
    {
        MessageBox.Show(excpt.Message);
    }

    return files;
}

リスト全体をメモリにロードせず、ブロックを回避したくない場合は、 following answer をご覧ください。

45
Darin Dimitrov

Directory.GetFiles を使用してメソッドを置き換えることができます。

 Directory.GetFiles(dirPath, "*", SearchOption.AllDirectories)
133
Tilak

これを使用するだけです:

public static List<String> GetAllFiles(String directory)
{
    return Directory.GetFiles(directory, "*.*", SearchOption.AllDirectories).ToList();
}

すべてのファイルが必要な場合は、拡張子のないファイルも含めて:

public static List<String> GetAllFiles(String directory)
{
    return Directory.GetFiles(directory, "*", SearchOption.AllDirectories).ToList();
}
22

次のようなものを使用できます。

string [] filePaths = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);

」を使用する代わりに、ファイル名を入力するか、「*。txt」などのタイプを入力することもできますSearchOption.AllDirectoriesは、検索するすべてのサブフォルダーは、 here

13
sam

一時変数ではなくフィールドとして宣言されているfilesに文字列を追加する理由がわかりません。 DirSearchの署名を次のように変更できます。

private List<string> DirSearch(string sDir)

そして、catchブロックの後に、次を追加します。

return files;

または、メソッド内に一時変数を作成して返すこともできますが、これは私が望むアプローチのようです。そうしないと、そのメソッドを呼び出すたびに、新しく見つかった文字列が以前と同じリストに追加され、重複することになります。

3
Mir

これは、フォルダーとそのサブフォルダー内のすべてのファイルのリストを取得し、テキストドキュメントに保存しようとしている人向けです。以下は、「using」ステートメント、「namespace」、「class」、「methods」などを含む完全なコードです。各部分が何をしているのかを理解できるように、コード全体で可能な限りコメントを付けました。これにより、特定のルートフォルダーのすべてのフォルダーとサブフォルダー内のすべてのファイルのリストを含むテキストドキュメントが作成されます。結局のところ、リスト(Console.WriteLineのように)で何もできなければ、それは良いことです。ここで、「Folder1」という名前のCドライブにフォルダーを作成し、その中に「Folder2」という名前のフォルダーを作成しました。次に、folder2に多数のファイル、フォルダー、およびそれらのフォルダー内のファイルとフォルダーを入力しました。このサンプルコードは、すべてのファイルを取得し、テキストドキュメントにリストを作成し、そのテキストドキュメントをFolder1に配置します。注意:テキストドキュメントをFolder2(読み取り元のフォルダー)に保存しないでください。これは悪い習慣です。常に別のフォルダに保存してください。
これが誰かの助けになることを願っています。

using System;
using System.IO;

namespace ConsoleApplication4
{
    class Program
    {
        public static void Main(string[] args)
        {
            // Create a header for your text file
            string[] HeaderA = { "****** List of Files ******" };
            System.IO.File.WriteAllLines(@"c:\Folder1\ListOfFiles.txt", HeaderA);

            // Get all files from a folder and all its sub-folders. Here we are getting all files in the folder
            // named "Folder2" that is in "Folder1" on the C: drive. Notice the use of the 'forward and back slash'.
            string[] arrayA = Directory.GetFiles(@"c:\Folder1/Folder2", "*.*", SearchOption.AllDirectories);
            {
                //Now that we have a list of files, write them to a text file.
                WriteAllLines(@"c:\Folder1\ListOfFiles.txt", arrayA);
            }

            // Now, append the header and list to the text file.
            using (System.IO.StreamWriter file =
                new System.IO.StreamWriter(@"c:\Folder1\ListOfFiles.txt"))
            {
                // First - call the header 
                foreach (string line in HeaderA)
                {
                    file.WriteLine(line);
                }

                file.WriteLine(); // This line just puts a blank space between the header and list of files. 


                // Now, call teh list of files.
                foreach (string name in arrayA)
                {
                    file.WriteLine(name);
                }

            }
          }


        // These are just the "throw new exception" calls that are needed when converting the array's to strings. 

        // This one is for the Header.
        private static void WriteAllLines(string v, string file)
        {
            //throw new NotImplementedException();
        }

        // And this one is for the list of files. 
        private static void WriteAllLines(string v, string[] arrayA)
        {
            //throw new NotImplementedException();
        }



    }
}
2
Aubrey Love
String[] allfiles = System.IO.Directory.GetFiles("path/to/dir", "*.*", System.IO.SearchOption.AllDirectories);
1
Veera Induvasi

これを試して
class Program {static void Main(string [] args){

        getfiles get = new getfiles();
        List<string> files =  get.GetAllFiles(@"D:\Rishi");

        foreach(string f in files)
        {
            Console.WriteLine(f);
        }


        Console.Read();
    }


}

class getfiles
{
    public List<string> GetAllFiles(string sDirt)
    {
        List<string> files = new List<string>();

        try
        {
            foreach (string file in Directory.GetFiles(sDirt))
            {
                files.Add(file);
            }
            foreach (string fl in Directory.GetDirectories(sDirt))
            {
                files.AddRange(GetAllFiles(fl));
            }
        }
        catch (Exception ex)
        {

            Console.WriteLine(ex.Message);
        }



        return files;
    }
}
0
Ris