如何知道File.Copy成功了?

时间:2011-10-29 09:14:50

标签: c# .net exception return-value file-copying

静态方法File.Copy(String, String)不返回值。如果该功能成功与否,我如何以编程方式知道?如果没有抛出异常,File.Copy进展顺利。但我问的是如何将“不例外”作为条件。

这样的事情:

if(no exception happened){

//my code goes here

}

修改:我使用简单的计数器解决了问题如下:

int i=0;
try{
    File.Copy();
}
catch(e1){
    i++;
}
catch(e2){
    i++;
}

if(i==0){
    //my code goes here
}

感谢所有贡献者。我会通过你的答案选择最好的。

5 个答案:

答案 0 :(得分:22)

如果操作没有抛出任何异常,则表示它成功。可能的例外列表可用here

  

UnauthorizedAccessException

     
      
  • 来电者没有所需的权限。
  •   
     

ArgumentException

     
      
  • sourceFileNamedestFileName是零长度字符串,仅包含空格,或包含InvalidPathChars定义的一个或多个无效字符。

    < / LI>   
  • -OR -

  •   
  • sourceFileNamedestFileName指定目录。

  •   
     

ArgumentNullException

     
      
  • sourceFileName或destFileName为null。
  •   
     

PathTooLongException

     
      
  • 指定的路径,文件名或两者都超过系统定义的最大长度。例如,在基于Windows的平台上,路径必须少于248个字符,文件名必须少于260个字符。
  •   
     

DirectoryNotFoundException

     
      
  • sourceFileName或destFileName中指定的路径无效(例如,它位于未映射的驱动器上)。
  •   
     

FileNotFoundException

     
      
  • sourceFileName未找到。
  •   
     

IOException

     
      
  • destFileName存在。

  •   
  • -OR -

  •   
  • 发生了I / O错误。

  •   
     

NotSupportedException

     
      
  • sourceFileNamedestFileName格式无效。
  •   

答案 1 :(得分:11)

<强>错误

如果方法没有抛出异常,则不会发生错误。该方法能够执行它承诺会执行的工作,因此它将不再使用,并且不会尝试返回某种状态代码。您不需要检查状态代码,因为您将知道它已成功。

如果方法未通过复制操作,则会引发异常。在这种情况下,该方法无法执行它承诺会执行的工作,这意味着发生了奇怪的(异常),因此抛出异常。由于抛出异常,您将被迫处理它,或者您的程序爆炸。因此,检查状态代码毫无意义。您无法编写任何能够以任何方式读取该状态代码的代码,因为永远不会达到状态检查代码。代码流将转到catch块或程序终止。

这些概念是使用异常进行错误处理的基础。

如何处理异常

除非你需要,并且有一些合理的方法从异常中恢复,否则不要处理它们。让你的程序爆炸。这样可以更容易地在野外找到代码中的错误,因为未处理的异常会产生堆栈跟踪,这将告诉您程序的确切部分爆炸,以及代码如何达到这一点。 / p>

如果您有合理的恢复方法(例如只是向用户显示错误消息并重试操作,或者让他们输入不同的参数),那么您可以写一个try / {{1}阻止。编写可能在catch块中引发异常的代码,并在try块中写下恢复代码。

catch

请注意,您永远不应该捕获基本try { var file = File.Open(filename); // Todo: Work with open file here } catch(FileNotFoundException e) { MessageBox.Show("Failed to open file - " + e.ToString()); // Todo: Additional recovery here, // like telling the calling code to re-open the file selection dialog } 类型,而应该捕获您可以处理的特定派生异常类型(例如Exception)。这是有道理的,因为您可能无法编写将成功从FileNotFoundException恢复的代码,并且该异常可能会在代码中的任何位置抛出。如果你抓住OutOfMemoryException,那么你正在编写试图处理任何的代码,而不仅仅是你感兴趣的例外。

<强>完成

Exception是一个同步操作。所以一旦方法完成,那么实际的副本就完成了。

这意味着您可以在复制行之后立即编写一行代码。并且该代码可以期望文件存在,因为它可以被完全复制,并且可以访问它。

答案 2 :(得分:5)

如果该方法没有抛出异常,则表示它已成功。

答案 3 :(得分:2)

如果没有异常,则表示该文件已成功完全复制...

using System;
using System.IO;

class Test 
{
    public static void Main() 
    {
        string path = @"c:\temp\MyTest.txt";
        string path2 = path + "temp";

        try 
        {
            // Create the file and clean up handles.
            using (FileStream fs = File.Create(path)) {}

            // Ensure that the target does not exist.
            File.Delete(path2);

            // Copy the file.
            File.Copy(path, path2);
            Console.WriteLine("{0} copied to {1}", path, path2);

            // Try to copy the same file again, which should succeed.
            File.Copy(path, path2, true);
            Console.WriteLine("The second Copy operation succeeded, which was expected.");
        } 

        catch 
        {
            Console.WriteLine("Double copy is not allowed, which was not expected.");
        }
    }
}

答案 4 :(得分:1)

虽然我不知道你遇到了什么情况,但我有类似的情况,我必须复制文件,需要知道它是否成功,因为我无法在.NET API中找到任何有用的东西我唯一的选择是继续尝试,直到成功(尝试没有时间),例如在下面的代码中,我必须在5次尝试后放弃

private bool CopyDone()
{
  bool done = false;
  int i = 0;
  string source = "SourceFile";
  while (i < 5)
  {
    try
    {

      System.IO.File.Copy(source, target, true);
      i = 5;
      done = true;
    }
    catch (Exception exp)
    {
      Trace.WriteLine("File trouble " + exp.Message);
      System.Threading.Thread.Sleep(1000);
      i++;
    }

   }

  /* if(!done)
   {
      Trace.WriteLine("Failed to copy file "+source );
   }*/
  return done;

}
相关问题