13

system.io.file クラスを使用してファイルを削除した後:

System.IO.File.Delete(openedPdfs.path);

ファイルが正常に削除された場合は、コードを実行する必要があります。メソッドが値を返さない限り、削除メソッドの後にファイルが存在するかどうかを確認しています。まだ存在する場合は、操作が失敗したと思います。

問題は、削除方法が正常に機能することですが、ファイルが削除されるまでに数秒かかります。Exist 関数は、チェック時にファイルが存在するため、true を返します。

System.IO.File.Delete(openedPdfs.path);が正常に完了したかどうかを確認するにはどうすればよいですか?

コード:

FileInfo file = new FileInfo(openedPdfs.path);    
System.IO.File.Delete(openedPdfs.path);
if (file.Exists == false)
{ ... }
else 
{ ... }
4

8 に答える 8

12

他の人が指摘したように、File.Deleteメソッドは失敗した場合に例外をスローします。

彼らが指摘するのを省略したのは、ほとんどすべてのケースで例外がスローされるが、すべてのケースではないということです。具体的には、削除するファイルがまだ存在していない場合、File.Deleteメソッドは例外をスローしません。(え?何考えてたの?)

そのため、ファイルを削除するにファイルが存在するかどうかを確認する必要があります。存在しない場合は、何もしないでください。存在する場合は、 を呼び出す必要がありますFile.Delete。例外がスローされた場合は、ファイルが削除されていないため、何もしないでください。それ以外の場合は、既存のファイルの削除が成功した後の作業を行う必要があります。

于 2013-01-04T16:37:23.153 に答える
2

Deleteファイルが削除されていない場合は、例外をスローする必要があります。したがって、への呼び出しExistsは冗長です。

のドキュメントをDelete参照してください。

于 2013-01-04T16:12:17.683 に答える
1

これはDanielA.Whiteの回答の補助です。メソッドのシグネチャはですpublic static void Delete(string path)。したがって、明らかに、例外を除いて、Delete呼び出しからフィードバックを受け取ることはありません。しかし、別のプロセスによって定期的に書き込まれたり更新されたりするファイルがあるとします。

  1. プログラムはファイルを正常に削除します。
  2. 他のプロセスは、削除の直後にそれを再作成します。
  3. プログラムはで存在をテストしfile.Existsます。同じ名前の新しいファイルがあるので、trueを返します。あなたは技術的に間違った道を進んでいます。

この正確なシナリオは、現在解決しようとしている問題には当てはまらない可能性がありますが、Delete呼び出しが例外をスローしたかどうかを確認することは、現在の実装に依存するよりもはるかに堅牢です。

于 2013-01-04T16:23:29.063 に答える
0

コメントと提案から、あなたはあなたの望む結果を達成するために以下を使うことができるはずです

try {
  FileInfo file = new FileInfo(openedPdfs.path);    
  System.IO.File.Delete(openedPdfs.path);
  // if no exception is thrown then you should assume all has gone well and put  
  // your file successfully deleted code here.
} catch /*(Specfic exceptions can be referenced here in separate catch blocks see Daniel A. White answer)*/ {
  // If something bad happened and the file was not deleted put handling code here
} finally {
  // if some action needs to be taken regardless of whether the file was successfully deleted or not put 
  // that code here
}
于 2013-01-04T16:28:36.620 に答える
0

FileInfo Delete() インスタンス メソッドを使用すると、FileInfo インスタンス プロパティ Exists が更新されないことがわかりました。
たとえば、次のコードは、ファイルが削除されているにもかかわらず、2 番目のコードがif (output_file.Exists)まだ true と評価されるため、ファイルが見つからないという例外をスローします。

FileInfo output_file;
if (output_file.Exists) output_file.Delete();   

FileStream fs;
if (output_file.Exists)
{
     fs = new FileStream(fi.FullName, FileMode.Open, FileAccess.ReadWrite);
}
else
{
     fs = new FileStream(fi.FullName, FileMode.CreateNew, FileAccess.ReadWrite);
}

古い FileInfo から新しい FileInfo を作成すると、問題が解決することがわかりました。

FileInfo output_file;
if (output_file.Exists)
{
    output_file.Delete();
    output_file = new FileInfo(output_file.FullName);      
}

FileStream fs;
if (output_file.Exists)
{
     fs = new FileStream(fi.FullName, FileMode.Open, FileAccess.ReadWrite);
}
else
{
     fs = new FileStream(fi.FullName, FileMode.CreateNew, FileAccess.ReadWrite);
}
于 2015-04-05T21:24:58.027 に答える
0

ファイルが存在しない場合、例外はスローされません。エラーの場合、削除できなかった場合は例外がスローされます。確認してくださいFile.Delete

于 2013-01-04T16:13:35.783 に答える
0

いつも使えます

 System.IO.File.Exists(path)

私は Daniel に同意しますが、Delete が例外をスローしない場合は問題ありません。

于 2013-01-04T16:13:47.207 に答える