3

主なタスクの一部として、指定された名前のディレクトリのディレクトリとそのサブディレクトリを検索し、指定されたディレクトリ名で終了する各ファイルパスを文字列配列に保存する必要があるソフトウェアツールを作成しています。例えば:

                   level_1 level_2 Level_3
ルートディレクトリ ---> フォルダ A ---> フォルダ D ---> フォルダ F ---> ターゲット
             | | |---> フォルダ E ---> ターゲット
             | |            
             |---> フォルダ B ---> ターゲット
             | |
             |---> FolderC ---> ターゲット

ポンプアウトする必要があります:

string[] = {RootDirectory\folderA\FolderD\folderF\Target,  
    RootDirectory\folderA\folderE\Target, 
    Rootdirectory\folderB\Target, 
    RootDirectory\foderC\Target}

もともとgetDirectories(myPath, "Target", SearchOption.AllDirectories)ディレクトリ情報オブジェクトで使用していましたが、問題がありました。何らかの理由で、フォルダー b と c の下、さらにフォルダー A>フォルダー D>フォルダー F の下にターゲットが見つかりますが、フォルダー E はスキップされます。サブディレクトリ folderA 内で最初に見つかった場合は、level_1 の次のフォルダーに進みます。この例のように、私の実際のケースでは、folderD は実際には folderE の前にアルファベット順にソートされていたことに言及する必要があります。

その代わりにIEnumerator、指定されたディレクトリ名で終了するファイルを選択するために where フィルターを使用して実行することにしました。これで全員見つかりました。getDirectories().Where(x=>(x.attributes & fileattributes.hidden)==0);ただし、のようなことを行う方法がわかりませんIEnumerator

問題は、プロセスが大幅に遅くなるため、非表示の SVN ディレクトリをスキップする必要があることです。

ここに私の質問があります。特定のディレクトリ名で終わるサブディレクトリ内のすべてのパスのコレクションを取得し、隠しファイルを検索から除外するにはどうすればよいですか?

4

2 に答える 2

1

my のルートにフォルダー構造を作成し、C:\Linqpad を使用して次のコードを作成しました。

string root = "c:\\folderA";
string target = "Target";   
var d = new DirectoryInfo(root);
var x = d.EnumerateDirectories(target, SearchOption.AllDirectories);
x.ToList() // for each element, it's in the the FullName 

.svn不足している唯一の部分は、フォルダーを無視することです

于 2012-05-21T22:38:27.940 に答える
0

独自の実装を作成する必要があると思います。.net 4.0 を使用している場合は、EnumerateDirectoriesを使用できます

次のようにします。

private IEnumerable<DirectoryInfo> EnumerateDirectories(DirectoryInfo dir, string target)
{
    foreach (var di in dir.EnumerateDirectories("*",SearchOption.TopDirectoryOnly))
    {
        if ((di.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden)
        {
            if (di.Name.EndsWith(target, StringComparison.OrdinalIgnoreCase))
            {
                 yield return di;
                 continue;
            }
            foreach (var subDir in EnumerateDirectories(di, target))
            {
                yield return subDir;
            }
        }
    }
}

それで:

DirectoryInfo dir = new DirectoryInfo(@"C:\RootDirectory");
var found = EnumerateDirectories(dir,"target").ToArray();

このようにして、「ターゲット」を見つけるか、隠しディレクトリに到達すると、サブディレクトリを通過するのをやめます。

于 2012-05-21T23:17:00.743 に答える