如何知道File.Copy成功了?

Aan*_*Aan 17 .net c# exception return-value file-copying

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

像这样的东西:

if(no exception happened){

//my code goes here

}
Run Code Online (Sandbox Code Playgroud)

编辑:我使用一个简单的计数器解决了这个问题如下:

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

if(i==0){
    //my code goes here
}
Run Code Online (Sandbox Code Playgroud)

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

Nas*_*ine 23

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

UnauthorizedAccessException

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

ArgumentException

  • sourceFileName或者destFileName是零长度字符串,仅包含空格,或包含一个或多个无效字符InvalidPathChars.

  • -要么-

  • sourceFileNamedestFileName指定目录.

ArgumentNullException

  • sourceFileName或destFileName为null.

PathTooLongException

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

DirectoryNotFoundException

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

FileNotFoundException

  • sourceFileName 没找到.

IOException

  • destFileName 存在.

  • -要么-

  • 发生了I/O错误.

NotSupportedException

  • sourceFileName或者destFileName格式无效.


Mer*_*ham 12

错误

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

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

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

如何处理异常

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

如果您有合理的恢复方法(例如只是向用户显示错误消息并重试操作,或让他们输入不同的参数),那么您可以编写try/ 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
}
Run Code Online (Sandbox Code Playgroud)

请注意,您永远不应该捕获基Exception类型,而应该捕获您可以处理的特定派生异常类型(例如FileNotFoundException).这是有道理的,因为您可能无法编写将成功从中恢复的代码OutOfMemoryException,并且该异常可能会在代码中的任何位置抛出.如果你抓住了Exception,那么你正在编写试图处理任何事情的代码,而不仅仅是你感兴趣的例外.

完成

File.Copy是一个同步操作.因此,一旦方法完成,则实际副本已完成.

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


Dar*_*rov 6

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

  • @Adban:您对C#和例外有多熟悉?如果您不确定如何查看异常是否发生,可能值得更多地阅读书籍 - 不要试图通过这个`File.Copy`调用 - 了解有关异常*的更多信息*. (4认同)
  • @Adban:嗯,你把方法调用放在一个try/catch块中 - 如果你没有点击catch块,它就不会抛出异常......(例如,你可能有`return true;`just在try块内部的`File.Copy`调用之后,以及catch块中的`return false;`,如果你只需要一个方法,它将返回它是否成功.) (2认同)