1

そこで、特定の拡張子を持つ特定のファイルのバックアップを作成するプログラムを作成するので、「バックアップを作成したい」の拡張子を持つリストまたは配列で入力します

List<string> extensions = new List<string>();
extensions.Add("*.pdf");
extensions.Add("*.txt");
extensions.Add("*.inf");
extensions.Add("*.doc");
extensions.Add("*.cpp");
extensions.Add("*.cs");
extensions.Add("*.vb");

わかりましたが、検索システムをどのように作成すれば、フォルダー内のその拡張子を持つファイルを見つけることができますか..

検索システムはシンプルです:

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

わかりましたが、リスト内のすべての拡張機能を検索するためにこれを作成する方法 (最も高速なシステムを作成するため) と、プログラムは Windows フォルダーに入ることができません... sDir = "C:\" を設定した場合

4

5 に答える 5

1

GetFiles「最も高速なシステムを作成する」ことは、このレベルでは非常に野心的ですが、既存のものを単純に拡張するには、別のループが必要になります。ともかく、...

foreach (string d in Directory.GetDirectories(sDir)) {
  foreach (string e in extensions) {
    foreach (string f in Directory.GetFiles(d, e)) {

    }
  }
}
于 2013-02-18T16:39:29.817 に答える
1

GetFileオプションでオーバーロードを使用するSearchOption.AllDirectoriesと、再帰的に呼び出す必要がなくなります。また、LINQ を次のように使用しSelectManyます。

var result = extensions.SelectMany(e => 
                       Directory.GetFiles(sDir, e, SearchOption.AllDirectories));

更新:try catch保護されたフォルダーを無視するには、例外をスキップするために使用できます:

private string[] GetFiles(string directory, string pattern)
{
    try
    {
        return Directory.GetFiles(directory, pattern, 
                                       SearchOption.AllDirectories);
    }
    catch (Exception)
    {
        return new string[0];
    }
}

そう:

var result = extensions.SelectMany(e => GetFiles(sDir, e));
于 2013-02-18T16:48:32.013 に答える
0

複数の検索条件を指定できますが、値はセミコロンで区切ります

*.vb;*.txt

したがって、リストを使用して検索文字列を簡単に生成できます

var search = string.Join(";", extensions.ToArray());
...
foreach (string f in Directory.GetFiles(d, search))
{
    ...
}
于 2013-02-18T16:49:41.403 に答える
0

GetFiles(string Directory)を呼び出して結果を単一のリストに戻し、それを解析する方が、パフォーマンスが少し向上する場合があります。次のスニペットは、必要なことを実行する必要があります...

var extensions = new List<string> { ".pdf", ".txt", ".inf", ".doc", ".cpp", ".cs", ".vb" };
var files = Directory.GetFiles(topLevelFolder, "*.*", SearchOption.AllDirectories);
var matching = new List<string>();
foreach (var ext in extensions)
{
    matching.AddRange(files.Where(f => f.EndsWith(ext)));
}
于 2013-02-18T16:55:04.903 に答える
0

余分なループや再帰は必要ありません。Directory.GetFilesすべてのファイル名を再帰的に取得するオーバーロードを使用するだけです

    public void DirSearch(string sDir)
    {
        try
        {
            foreach (string item in extensions)
            {
                string[] files = Directory.GetFiles(sDir, item, SearchOption.AllDirectories);

                foreach (var file in files)
                {
                    Console.WriteLine(file);
                }
            }
        }
        catch (System.Exception excpt)
        {
            Console.WriteLine(excpt.Message);
        }
    }
于 2013-02-18T16:46:12.943 に答える