提问人:Aan 提问时间:10/29/2011 最后编辑:NasreddineAan 更新时间:8/10/2012 访问量:42897
如何知道File.Copy成功了?
How to know that File.Copy succeeded?
问:
static 方法不返回值。我怎样才能以编程方式知道该函数是否成功?如果没有抛出异常,则进展顺利。但我要问的是如何把“没有例外”作为一个条件。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
}
感谢所有贡献者。我将通过您的答案来选择最好的。
答:
如果该方法没有引发异常,则表示它已成功。
评论
File.Copy
return true;
File.Copy
return false;
如果操作未引发任何异常,则表示操作成功。可能的例外情况列表可在此处获得:
- 调用方没有所需的权限。
sourceFileName
或者是长度为零的字符串,仅包含空格,或者包含由InvalidPathChars
定义的一个或多个无效字符。destFileName
-或-
sourceFileName
或指定目录。destFileName
- sourceFileName 或 destFileName 为 null。
- 指定的路径和/或文件名都超过系统定义的最大长度。例如,在基于 Windows 的平台上,路径必须小于 248 个字符,文件名必须小于 260 个字符。
- sourceFileName 或 destFileName 中指定的路径无效(例如,它位于未映射的驱动器上)。
sourceFileName
未找到。
destFileName
存在。-或-
发生 I/O 错误。
sourceFileName
或格式无效。destFileName
评论
File.Exists
错误
如果该方法未引发异常,则未发生错误。该方法能够执行它承诺的工作,因此它将摆脱困境,并且不会尝试返回某种状态代码。您无需检查状态代码,因为您会知道它已成功。
如果该方法复制操作失败,则会引发异常。在这种情况下,该方法无法执行它承诺的工作,这意味着发生了一些奇怪的(异常)事情,因此引发了异常。由于抛出异常,您被迫处理它,否则您的程序就会爆炸。因此,检查状态代码是没有意义的。无论如何,您都无法编写任何能够读取该状态代码的代码,因为永远不会访问状态检查代码。代码流将进入块或程序终止。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
}
请注意,您永远不应该捕获基类型,而应该捕获可以处理的特定派生异常类型(例如 )。这是有道理的,因为您可能无法编写能够成功从 中恢复的代码,并且该异常可能会在代码中的任何时候引发。如果你抓住了 ,那么你正在编写试图处理任何事情的代码,而不仅仅是你感兴趣的异常。Exception
FileNotFoundException
OutOfMemoryException
Exception
完成
File.Copy
是同步操作。因此,一旦方法完成,实际副本就完成了。
这意味着您可以在复制行之后立即编写一行代码。该代码可以期望文件在那里,以便它被完全复制,并且可以访问它。
评论
如果没有例外,则表示文件已成功完全复制...
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;
}
评论