0

パス内のすべてのファイルを検索する必要があるメソッドを作成しました。再帰を使用してすべてのファイルを取得したいと思います。これが私の現在の方法です:

public void doStart(DirectoryInfo dir, string filePattern)
        {
            try
            {
                foreach (FileInfo fileInfo in dir.GetFiles(filePattern))
                {
                    if (fileFound != null)
                    {
                        fileFound(fileInfo);
                    }
                }
            }
            catch (Exception)
            {

            }

            try
            {
                foreach (DirectoryInfo dirInfo in dir.GetDirectories())
                {
                    doStart(dirInfo, filePattern);
                }
            }
            catch (Exception)
            {

            }
        }

        public void Start(string path, string filePattern)
        {
            doStart(new DirectoryInfo(path), filePattern);
        }

この種の再帰を書くためのより良い方法はありますか、それともこれで十分ですか?

4

3 に答える 3

7

次のようなものを試してください。

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

これにより、ディレクトリが再帰的に調べられ、特定のファイルタイプ('.filetype')を持つすべてのファイルが検索され、見つかったすべてのファイルを含む文字列配列が返されます。

また、アプリケーションで問題が発生した場合は通知されないため、空のcatchブロックは使用しないことをお勧めします。メッセージボックス(または同様のもの)を表示するか、データベースなどに記録します。

さらに、サブディレクトリにサブディレクトリがある場合、DoStart()メソッドは何をしますか?私が見ていることから、それは1つのサブレベルでのみ検索すると思います。

于 2012-12-18T20:36:49.973 に答える
1
  1. すべての例外を飲み込まないでください。特定の例外を無視する必要がある場合は、それらをキャッチしますが、他の例外をバブルアップさせます
  2. (スタイル)メソッドはPascalCasedである必要があります(例:DoStart`FileFound '
  3. (スタイル)直接OnFileFound呼び出す代わりにメソッドを作成します(イベントハンドラーだと思いますか?)FileFoundfileFound

それ以外は私には問題ないように見えます。

于 2012-12-18T20:37:27.387 に答える
0

これが真の再帰の例です。これは、Directory.GetFiles SearchOption.AllDirectoriesとは異なり、検索するサブディレクトリがなくなるまで検索します。これを変更して、検索フィルターをパラメーターとして追加できます。

public IEnumerable<string> GetFilesRecursive(string ParentDirectory)
{
    string[] subDirectories = Directory.GetDirectories(ParentDirectory);
    foreach (string file in Directory.GetFiles(ParentDirectory))
    {
        yield return file;
    }

    foreach (string subDirectory in subDirectories)
    {
        foreach (string file in GetFilesRecursive(subDirectory))
        {
            yield return file;
        }
    }
}
于 2012-12-18T20:49:16.133 に答える