c# - 如果对文件的访问被拒绝,线程 try catch 继续

标签 c# .net-2.0 file-permissions permission-denied

使用系统线程循环遍历文件夹,如果访问文件被拒绝,如何忽略并继续。

// 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*************");
    }

}

最佳答案

正如丹尼尔在评论中提到的,基本上当你想继续进行下一次迭代时,你需要将 try/catch 移动到循环内部。目前您的 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 中并不常见;通常你会使用驼峰命名为变量(方法、类等使用 PascalCase)
  • using指令,您可以避免在代码中放置完全限定的类型名称,这将使阅读更容易
  • 这种方法最终会很长——我建议提取内部循环;可能包括 try/catch,也可能不包括。
  • 关于c# - 如果对文件的访问被拒绝,线程 try catch 继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12000373/

    相关文章:

    linux - SUID位有什么用

    c# - WPF,在C#中从XmlDataProvider中读取数据

    c# - 对于单元测试,Application.Current 为空

    c# - 为什么 Entity Framework 会生成嵌套的 SQL 查询?

    c# - 什么时候应该在 C# 2.0 和更新版本中使用 `Object`?泛型会替换所有出现的对象吗?

    jvm - Java 堆转储权限

    c# - 由于格式不正确,加载程序集失败

    c# - 如何强制 C# Web 服务对象属性中的最大字符串长度?

    EventHandler 创建的 C# Windows 窗体立即消失

    linux - 设置jenkins进程的umask