2

指定したフォルダー (MyFolder と呼びましょう) のサブディレクトリでファイルを検索し、サブディレクトリを文字列変数に保存して、他の場所で使用しようとしています。問題は、指定されたフォルダーに複数のサブディレクトリが存在する可能性があり、各サブディレクトリに独自のサブディレクトリが含まれている可能性があることです。MyFolder の下のツリーにある上記のサブディレクトリの 1 つだけに、探しているファイルがあります。

以下の例では、2 つの場所 (この例ではそれ以上の可能性があります) のいずれかにある可能性がありますが、両方にあることはありません。

-Root    
--/MyFolder    
---/a    
-----/aa    
-------------/blah.txt  (or if not here, it may be...)    
---/b    
-------/blah.txt  (...right here, possibly)

blah.txtもちろん、私は見つけようとしています。

以下に示すように再帰foreachループを作成しましたが、サブディレクトリの最初のレベルでファイルが見つかった場合にのみ、サブディレクトリが返されます(/a, or /b)。ファイルが/aa or /bbより深い場合 (root/a/aa/aaa,たとえば)、毎回 NULL を返します。デバッガーをゆっくりとステップ実行し、ローカルウィンドウを注意深く見て、これを修正しようと何時間も費やしましたが、何が問題なのかわかりません。ファイルを見つけて、2 番目のループで正しいサブディレクトリ パスを保存しますforeachが、何らかの理由で、逆方向のループを開始します (. に到達するまで前のディレクトリを表示しますreturn "Null";)。これは、ファイルがサブディレクトリの第 1 レベルで見つかった場合には発生せず、第 2 レベルまたはそれより深いレベルで見つかった場合にのみ発生します。

class Program
{
    static string dir = @"C:\MyFolder\";

    static void Main(string[] args)
    {
        Console.WriteLine(GetDirectory(dir));
        Console.ReadKey();
    }

    static string GetDirectory(string dir)
    {
        foreach (string dName in Directory.GetDirectories(dir))
        {
            foreach (string fName in Directory.GetFiles(dName, "blah.txt"))
            {
                return dName;
            }
            GetDirectory(dName);
        }
        return "NULL";
    }
}

このような動作を私が見た唯一の方法は、パスを他の場所で使用できる文字列として保存しようとしているのではなく (おそらく他の関数でも)、void 戻り値の型としてすぐに表示する場合です。コンソールのように(リターンを"Console.WriteLine(dName)"変更し、関数呼び出しを適切に変更することにより)。

私は C# に非常に慣れていません。これまでのコーディング経験は JavaScript とAutoHotkey. ...そして、私はこの特定の問題に対して勇敢に両方を検索しました..いわば、どんな助けや指針も大歓迎です!

4

3 に答える 3

6

組み込みの再帰検索を使用しないのはなぜですか?

何かのようなもの

Directory.GetFiles(@"C:\MyFolder\", "blah.txt", SearchOption.AllDirectories)

Directory.GetFiles メソッド (文字列、文字列、SearchOption)SearchOption 列挙を見てください。

またはDirectoryInfoでさえ。

何かのようなもの

new DirectoryInfo(@"C:\MyFolder\").GetFiles("blah.txt", SearchOption.AllDirectories)
于 2012-08-07T06:56:40.923 に答える
1

によって最初に見つかったものを単に取得するのはどうDirectory.EnumerateFiles()ですか?

var fileToSearch = "blah.txt";
var matchingFile = Directory.EnumerateFiles(dir, fileToSearch, SearchOption.AllDirectories)
                              .FirstOrDefault();

if(matchingFile != null)
{
    Console.WriteLine("File found: " + matchingFile);
}
else
{
    Console.WriteLine("Could nowhere below \"" + dir + "\" find the file \"" + fileToSearch + "\".");
}
于 2012-08-07T07:05:02.743 に答える
1

ファイル ループをディレクトリ ループの前に移動します。return を dName ではなく dir に変更します。

于 2012-08-07T06:57:06.557 に答える