17

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

すべての貢献者に感謝します。私はあなたの答えを見て、最良のものを選びます。

4

5 に答える 5

24

操作で例外がスローされない場合は、操作が成功したことを意味します。考えられる例外のリストは、こちらから入手できます。

UnauthorizedAccessException

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

ArgumentException

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

  • -また-

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

ArgumentNullException

  • sourceFileName または destFileName がヌルです。

PathTooLongException

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

DirectoryNotFoundException

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

FileNotFoundException

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

IOException

  • destFileName存在します。

  • -また-

  • I/O エラーが発生しました。

NotSupportedException

  • sourceFileNameまたはdestFileName無効な形式です。
于 2011-10-29T09:18:41.607 に答える
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
}

Exception基本型をキャッチしてはならず、代わりに、処理可能な特定の派生例外タイプ (例: ) をキャッチする必要があることに注意してくださいFileNotFoundExceptionOutOfMemoryExceptionから正常に回復するコードを書くことはおそらく不可能であり、その例外はコードの任意の時点でスローされる可能性があるため、これは理にかなっています。をキャッチすると、関心のある例外だけでなく、何でもException処理しようとするコードを書いていることになります。

完了

File.Copy同期操作です。したがって、メソッドが完了すると、実際のコピーが完了します。

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

于 2011-10-29T09:37:55.253 に答える
6

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

于 2011-10-29T09:17:02.157 に答える
2

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

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.");
        }
    }
}
于 2011-10-29T09:51:10.620 に答える
1

あなたがどのような状況に陥っているのかはわかりませんが、ファイルをコピーする必要がある同様の状況があり、それが成功したかどうかを知る必要がありました..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;

}
于 2011-10-29T10:03:19.997 に答える