Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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 - Fatal编程技术网

C# 是否有办法处理所有文件/文件夹异常

C# 是否有办法处理所有文件/文件夹异常,c#,.net,C#,.net,在我详细阐述我的问题之前,我不是一个专业的程序员/程序员,但最近的一个项目涉及大量的读取文件、写入文件、将文件移动到文件夹等,我想知道如何最好地处理来自多个源的异常(所有这些都是文件/文件夹读取/写入) 该项目在一些基于文件的操作上有一个基本的“重试”功能,它将休眠一秒或2秒,然后重试最多X次-然后它将抛出一个消息框,基本上说明它无法执行此操作 是否有一种方法可以处理任何/所有文件/文件夹访问异常,为其创建一个“重试”例程—让它在最终放弃并通知某人之前重试以前尝试过的操作(但失败了)—或者这是应

在我详细阐述我的问题之前,我不是一个专业的程序员/程序员,但最近的一个项目涉及大量的读取文件、写入文件、将文件移动到文件夹等,我想知道如何最好地处理来自多个源的异常(所有这些都是文件/文件夹读取/写入)

该项目在一些基于文件的操作上有一个基本的“重试”功能,它将休眠一秒或2秒,然后重试最多X次-然后它将抛出一个消息框,基本上说明它无法执行此操作

是否有一种方法可以处理任何/所有文件/文件夹访问异常,为其创建一个“重试”例程—让它在最终放弃并通知某人之前重试以前尝试过的操作(但失败了)—或者这是应该按每个文件操作执行的操作

我想我想的是,对于许多应用程序,如果一个操作失败——应用程序知道它以前在做什么,可以重试——但不是编写相同的“重试”代码(根据尝试的操作修改代码)——是否可以使用单个例程重试

我甚至不确定这是否可能,更不用说推荐了

“重试”代码非常基本,如下所示:

int retrycount = 3;
int retries = 0;

while (retries < retrycount)
{
   try
   {
      File.Copy(SomeFile, SomeOtherFile);
   }
   catch (Exception e)
   {
      // Try Again
      retries++;
   }

   if (File.Exists(SomeOtherFile) == true)
   {
      break;
   }
}
int retrycount=3;
int重试次数=0;
while(重试次数<重试次数)
{
尝试
{
复制(SomeFile,SomeOtherFile);
}
捕获(例外e)
{
//再试一次
重试++;
}
if(File.Exists(SomeOtherFile)==true)
{
打破
}
}
稍后,“retries”用于确定它是否完全失败(retries==retrycount),并在发生这种情况时发出警报


如果有人能提供任何建议,或者即使只是告诉我我所想的是可能的——这是不推荐的,也会很有帮助。

你可以通过传递一个
操作来做到这一点:

public void Retry(Action action, int retryCount)
{
    int retries = 0;

    while (retries < retryCount)
    {
       try
       {
          action();
          return;
       }
       catch (Exception e)
       {
          // Try Again
          retries++;
       }
    }
}


Retry(() => File.Copy(SomeFile, SomeOtherFile), 3);
public void重试(操作Action,int retryCount)
{
int重试次数=0;
while(重试次数<重试次数)
{
尝试
{
动作();
返回;
}
捕获(例外e)
{
//再试一次
重试++;
}
}
}
重试(()=>File.Copy(SomeFile,SomeOtherFile),3);

编辑:当然,之前也有人问过这个问题,请参见。

您可以通过传递
操作来实现这一点:

public void Retry(Action action, int retryCount)
{
    int retries = 0;

    while (retries < retryCount)
    {
       try
       {
          action();
          return;
       }
       catch (Exception e)
       {
          // Try Again
          retries++;
       }
    }
}


Retry(() => File.Copy(SomeFile, SomeOtherFile), 3);
public void重试(操作Action,int retryCount)
{
int重试次数=0;
while(重试次数<重试次数)
{
尝试
{
动作();
返回;
}
捕获(例外e)
{
//再试一次
重试++;
}
}
}
重试(()=>File.Copy(SomeFile,SomeOtherFile),3);
编辑:当然,以前也有人问过这个问题,请参见。

一种方法:

  • 1创建一个
    队列
    {File,lastTest,Attempts}
  • 2将所有文件添加到队列中
  • 3从列表中获取条目
  • 4如果上次尝试后没有足够的时间,请等待
  • 5尝试操作,递增
    尝试次数
  • 6如果操作失败,请将
    上次尝试
    更新为
    日期时间。现在
    ,添加回队列末尾(除非
    尝试
    大于某个阈值,在这种情况下,您将文件添加到失败文件列表中)
  • 7如果队列中仍有条目,请从3开始重复
    • 一种方法:

      • 1创建一个
        队列
        {File,lastTest,Attempts}
      • 2将所有文件添加到队列中
      • 3从列表中获取条目
      • 4如果上次尝试后没有足够的时间,请等待
      • 5尝试操作,递增
        尝试次数
      • 6如果操作失败,请将
        上次尝试
        更新为
        日期时间。现在
        ,添加回队列末尾(除非
        尝试
        大于某个阈值,在这种情况下,您将文件添加到失败文件列表中)
      • 7如果队列中仍有条目,请从3开始重复

      我会稍微改变这一点,为
使用
,保存一些代码行,并且不声明
e
,因为这会引起警告。@Andrew你是对的,但在回答时,我倾向于让代码尽可能接近OP的代码。从整个重写过程中,他们学到的东西往往较少这类事情是否适用于其他事情,如数据库访问——例如尝试插入记录?它适用于任何事情。在这种情况下,您可能只需要在重试之间添加延迟。第三个参数是一个不错的选择。我会稍微改变这个参数,为
使用一个
,保存一些代码行,并且不声明
e
,因为这会引起警告。@Andrew你是对的,但在回答时,我倾向于让代码尽可能接近OP的代码。从整个重写过程中,他们学到的东西往往较少这类事情是否适用于其他事情,如数据库访问——例如尝试插入记录?它适用于任何事情。在这种情况下,您可能只需要在重试之间添加延迟。第三个参数是一个不错的选择。