静的メソッド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
}
すべての貢献者に感謝します。最良のものを選ぶためにあなたの答えを調べます。
操作が例外をスローしない場合、それは成功したことを意味します。可能な例外のリストが利用可能です ここ :
- 呼び出し元には必要な権限がありません。
sourceFileName
またはdestFileName
は、長さ0の文字列であるか、空白のみを含むか、またはInvalidPathChars
で定義されている1つ以上の無効な文字を含みます。-または-
sourceFileName
またはdestFileName
はディレクトリを指定します。
- sourceFileNameまたはdestFileNameがnullです。
- 指定されたパス、ファイル名、またはその両方がシステム定義の最大長を超えています。たとえば、Windowsベースのプラットフォームでは、パスは248文字未満、ファイル名は260文字未満である必要があります。
- SourceFileNameまたはdestFileNameで指定されたパスは無効です(たとえば、マップされていないドライブ上にあります)。
sourceFileName
が見つかりませんでした。
destFileName
が存在します。-または-
入出力エラーが発生しました。
sourceFileName
またはdestFileName
の形式が無効です。
エラー
メソッドが例外をスローしない場合、エラーは発生していません。このメソッドは、約束した仕事を実行できたので、邪魔にならず、なんらかのステータスコードを返そうとしません。成功したことがわかるので、ステータスコードを確認する必要はありません。
メソッドがコピー操作に失敗すると、例外がスローされます。この場合、メソッドが実行すると約束されたジョブを実行できませんでした。これは、奇妙な(例外的な)ことが発生したため、例外がスローされます。例外がスローされるので、あなたはそれを処理せざるを得ないか、プログラムが爆発します。したがって、ステータスコードをチェックしても意味がありません。ステータスチェックコードに到達しないため、そのステータスコードを読み取ることができるコードを記述することはできません。コードフローは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.");
}
}
}
私はあなたがどのような状況にいるかはわかりませんが、ファイルをコピーする必要があり、それが成功したかどうかを知る必要があった同様の状況があります。それは成功します(何度か試してください)たとえば、次のコードでは、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;
}