指定したフォルダー (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
. ...そして、私はこの特定の問題に対して勇敢に両方を検索しました..いわば、どんな助けや指針も大歓迎です!