60

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

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()で、リストにパスが「入力」されますが、それを複数回使用して、異なるディレクトリなどで異なるリストを作成できるようにしたいと考えています.

4

9 に答える 9

168

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

 Directory.GetFiles(dirPath, "*", SearchOption.AllDirectories)
于 2013-01-13T16:40:00.297 に答える
60
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.

于 2013-01-13T16:40:23.000 に答える
25

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

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();
}
于 2013-01-13T16:45:21.833 に答える
3

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

private List<string> DirSearch(string sDir)

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

return files;

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

于 2013-01-13T16:39:45.117 に答える
2
String[] allfiles = System.IO.Directory.GetFiles("path/to/dir", "*.*", System.IO.SearchOption.AllDirectories);
于 2016-09-03T01:48:20.983 に答える
0

この
クラスを試してください 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;
    }
}
于 2015-11-30T06:20:09.610 に答える