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

正如 Daniel 在评论中提到的,基本上当您想继续进行下一次迭代时,您需要将 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 回答