1

複製ファイル ソフトウェアを完成させようとしているときに、Directory.GetDirectories() メソッドに問題があることに気付きました。何らかの理由でフォルダーにアクセスできない場合 (ほとんどの場合、フォルダーがシステム フォルダーであることが原因でした)、例外がスローされるため、ループが停止していました。

再帰を手動で実行するための最良の方法を見つけようとするいくつかの調査の後、私は自分のニーズに完全に対応するMarc Gravell の例を見つけました。

上記の方法に関する私の問題は、再帰メソッドがファイル/フォルダーの処理をいつ終了したかを知る方法がわからないことです。したがって、この問題に関する洞察をいただければ幸いです。

前もって感謝します。

4

2 に答える 2

1

操作が完了した後にメッセージ ボックスを配置します。

static void Main()
{
  string path = ""; // TODO
  ApplyAllFiles(path, ProcessFile, FolderProcessed);
  MessageBox.Show("Operation complete.");
}
于 2012-06-30T17:59:49.233 に答える
0

あなたがやろうとしていることを明確にできますか?

Marc が提供するサンプル コードでは、検出されたすべてのファイルに対して呼び出されるアクションを提供する必要があります。したがって、そのアクションの呼び出しは、そのファイルの処理を表します。

フォルダー内のすべてのファイルとサブフォルダーがいつ処理されたかを判断する方法を探している場合は、コードを変更して 2 番目のアクションを追加する必要があります。このようなもの:

using System;
using System.IO;
static class Program
{
    static void Main()
    {
        string path = ""; // TODO
        ApplyAllFiles(path, ProcessFile, FolderProcessed);
    }
    static void ProcessFile(string path) {/* ... */}
    static void FolderProcessed(string path) {/* ... */}

    static void ApplyAllFiles(string folder, Action<string> fileAction, Action<string> folderProcessed)
    {
        foreach (string file in Directory.GetFiles(folder))
        {
            fileAction(file);
        }
        foreach (string subDir in Directory.GetDirectories(folder))
        {
            try
            {
                ApplyAllFiles(subDir, fileAction);
            }
            catch
            {
                // swallow, log, whatever
            }
        }

        //**** New action invoked here:
        folderProcessed(folder);
    }
}
于 2012-06-30T17:53:21.627 に答える