web-dev-qa-db-ja.com

File.Copyが成功したことを知る方法は?

静的メソッド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
}

すべての貢献者に感謝します。最良のものを選ぶためにあなたの答えを調べます。

17
Aan

操作が例外をスローしない場合、それは成功したことを意味します。可能な例外のリストが利用可能です ここ

UnauthorizedAccessException

  • 呼び出し元には必要な権限がありません。

ArgumentException

  • sourceFileNameまたはdestFileNameは、長さ0の文字列であるか、空白のみを含むか、または InvalidPathChars で定義されている1つ以上の無効な文字を含みます。

  • -または-

  • sourceFileNameまたはdestFileNameはディレクトリを指定します。

ArgumentNullException

  • sourceFileNameまたはdestFileNameがnullです。

PathTooLongException

  • 指定されたパス、ファイル名、またはその両方がシステム定義の最大長を超えています。たとえば、Windowsベースのプラットフォームでは、パスは248文字未満、ファイル名は260文字未満である必要があります。

DirectoryNotFoundException

  • SourceFileNameまたはdestFileNameで指定されたパスは無効です(たとえば、マップされていないドライブ上にあります)。

FileNotFoundException

  • sourceFileNameが見つかりませんでした。

IOException

  • destFileNameが存在します。

  • -または-

  • 入出力エラーが発生しました。

NotSupportedException

  • sourceFileNameまたはdestFileNameの形式が無効です。
24
Nasreddine

エラー

メソッドが例外をスローしない場合、エラーは発生していません。このメソッドは、約束した仕事を実行できたので、邪魔にならず、なんらかのステータスコードを返そうとしません。成功したことがわかるので、ステータスコードを確認する必要はありません。

メソッドがコピー操作に失敗すると、例外がスローされます。この場合、メソッドが実行すると約束されたジョブを実行できませんでした。これは、奇妙な(例外的な)ことが発生したため、例外がスローされます。例外がスローされるので、あなたはそれを処理せざるを得ないか、プログラムが爆発します。したがって、ステータスコードをチェックしても意味がありません。ステータスチェックコードに到達しないため、そのステータスコードを読み取ることができるコードを記述することはできません。コードフローは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は同期操作です。したがって、メソッドが完了すると、実際のコピーが完了します。

つまり、コピー行の直後にコード行を記述できます。そして、そのコードは、ファイルがそこにあること、完全にコピーされること、そしてアクセス可能であることを期待できます。

12

メソッドが例外をスローしない場合、それは成功したことを意味します。

6
Darin Dimitrov

ファイルが正常に完全にコピーされたことを意味する例外がない場合...

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

私はあなたがどのような状況にいるかはわかりませんが、ファイルをコピーする必要があり、それが成功したかどうかを知る必要があった同様の状況があります。それは成功します(何度か試してください)たとえば、次のコードでは、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;

}
1
Surjit Samra