2

システムスレッドを使用してフォルダをループし、ファイルへのアクセスが拒否された場合に無視して続行する方法。

// Start thread.  
System.Threading.ThreadStart start = delegate { scanner(@"C:\", "*.html;*.txt"); };
System.Threading.Thread thread = new System.Threading.Thread(start);
thread.Start();


private static string scanstatus = string.Empty;
private static void scanner(string folder, string patterns) 
{
    try
    {  
        // Get the patterns.
        string[] pattern_array = patterns.Split(';');

        // Search.
        foreach (string pattern in pattern_array)
        {
            foreach (string path in System.IO.Directory.GetFiles(folder, pattern, System.IO.SearchOption.AllDirectories))
            {
                // trim path
                scanstatus = (path.Length > 60) ? "../" + path.Substring(path.Length - 59, 59) : path;

                System.Threading.Thread.Sleep(5000);
            }
        }

    }
    catch (System.Exception excpt)
    {
        Console.WriteLine(excpt.Message);
    }
    finally
    {
        Console.WriteLine("*************DONE*************");
    }

}
4

1 に答える 1

3

ダニエルがコメントで述べたように、基本的に次の反復を続けたい場合は、try/catch をループ内に移動する必要があります。現在、キャッチは外側のループの外にあるため、例外がスローされた場合、実行は続行できません。C# には、「到達したところから続行する」という概念はありません。

キャッチするもの制限することを強くお勧めします。例えば:

foreach (string pattern in patternArray)
{
    try
    {
        foreach (string path in Directory.GetFiles(...))
        {
            // ...
        }
    }
    catch (IOException e)
    {
        // Log it or whatever
    }
    // Any other exceptions you want to catch?
}

ノート:

  • キャッチExceptionは、ほとんどの場合、リクエスト (またはその他の) 処理の最上位レベルでの最終的なバックストップを除いて、悪い考えです。
  • 変数名のアンダースコアは、.NET では一般的ではありません。通常、変数には camelCase を使用します (メソッドやクラスなどには PascalCase を使用します)。
  • ディレクティブを使用すると、完全修飾型名をコードに入れることを避けることができます。これによりusing、読みやすくなります。
  • このメソッドは非常に長くなります。内側のループを抽出することをお勧めします。おそらくtry/catchを含むか、含まない可能性があります。
于 2012-08-17T05:50:02.977 に答える