Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果对文件的访问被拒绝,线程将继续尝试捕获_C#_.net 2.0_File Permissions_Permission Denied - Fatal编程技术网

C# 如果对文件的访问被拒绝,线程将继续尝试捕获

C# 如果对文件的访问被拒绝,线程将继续尝试捕获,c#,.net-2.0,file-permissions,permission-denied,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 scansta

使用系统线程在文件夹中循环,如何在文件访问被拒绝时忽略并继续

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

}

正如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?
}
注:

  • 捕获
    异常
    几乎总是一个坏主意,除非是作为请求(或其他)处理顶层的最后一个后盾
  • 变量名中的下划线在.NET中并不常见;通常情况下,变量使用camelCase(方法、类等使用PascalCase)
  • 使用指令可以避免在代码中放入完全限定的类型名,这将使代码更易于阅读
  • 这种方法最终会非常长——我建议提取内部循环;可能包括try/catch,也可能不包括

在循环中放置
try catch
有什么问题?它不会继续。我不确定我做错了什么你需要把
try catch
放在循环中。它在循环外…这是因为你的循环在try catch内。当拒绝访问异常引发程序传输流到循环外的catch。这对我不起作用。特别是对于Excel文件,这一行只是挂起,不会引发异常:
wb=Excel.Workbooks.Open(filePath,false,true,5,null,“错误密码”)。如果你得到许可,你知道如何测试吗?@powermosfet:那么它做什么呢?如果抛出异常,它将继续到下一个线程。@Jeremythonpson:我看不出Excel与这个问题有什么关系。OP当然从来没有提到过。这个问题的措辞显然意味着抛出了一个异常。