如何知道File.Copy成功了?

静态方法File.Copy(String, String)不返回值。 如果该function成功与否,我怎么能以编程方式知道呢? 如果没有抛出exception, 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 } 

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

如果操作没有抛出任何exception,则表示它成功。 此处提供了可能的例外列表:

UnauthorizedAccessException

  • 呼叫者没有所需的权限。

ArgumentException

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

  • -要么-

  • sourceFileNamedestFileName指定目录。

ArgumentNullException

  • sourceFileName或destFileName为null。

PathTooLongException

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

DirectoryNotFoundException

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

FileNotFoundException

  • 找不到sourceFileName

IOException

  • destFileName存在。

  • -要么-

  • 发生了I / O错误。

NotSupportedException

  • sourceFileNamedestFileName的格式无效。

错误

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

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

这些概念是使用exception进行error handling的基础。

如何处理exception

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

如果您有合理的恢复方法(例如只是向用户显示错误消息并重试操作,或让他们输入不同的参数),那么您可以编写try / catch块。 编写可能在try块中引发exception的代码,并在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类型,而应该捕获您可以处理的特定派生exception类型(例如FileNotFoundException )。 这是有道理的,因为您可能无法编写将成功从OutOfMemoryException恢复的代码,并且该exception可能会在代码中的任何位置抛出。 如果你捕获Exception ,那么你正在编写试图处理任何事情的代码,而不仅仅是你感兴趣的例外。

完成

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

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

如果该方法没有抛出exception,则意味着它已成功。

如果没有exception,则表示文件成功完全复制…

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

虽然我不知道你遇到了什么情况,但我有类似的情况,我必须复制文件,需要知道它是否成功,因为我无法在.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; }