2011-12-29 15 views
4

私のプログラムは、起動時にログファイルを作成します。ユーザーは、ログファイルを削除する方法を呼び出す "ログをクリアする"という設定を使用するオプションがあります。削除した後にtxtファイルを作成できないのはなぜですか?

 //calls for a YesNo prompt to delete log or not 
     result = objectMessageBox.ReturnDeleteLogPrompt(); 

     if (result == DialogResult.Yes) 
     { 
      //throw prompt 
      if (File.Exists(objectLog.GetLogLocation()) == true) 
      { 
       try 
       {       
        //delete the log file 
        File.Delete(objectLog.GetLogLocation());       

        //throw balloon tip saying log was cleared 
        ShowBalloonTip("LogCleared"); 
       } 
       catch (Exception ee) 
       { 
        MessageBox.Show("Error thrown deleting log: " + ee); 
        System.Windows.Forms.Clipboard.SetText(ee.ToString()); 
       } 
      } 
     } 

ログファイルを完全に削除したため、再作成する必要があります。

try 
     { 
      //we create a new log file so it seems that the log has just been cleared 
      objectLog.CreateLog(); 
     } 
     catch (Exception ee) 
     { 
      MessageBox.Show("Error occured while clearing log:\n" + ee); 
     } 

しかし、それは、ログファイルを再作成しようとしたときにそれが言うエラースロー:

「System.IO.IOExceptionは:プロセスがアクセスすることはできませんがだから私はこれを持っているメソッドを呼び出しますファイル '~~'は別のプロセスで使用されているためです。

私の呼び出し中にファイルを削除しても、そのファイルにアクセスしているようです。 file.deleteと呼ぶときに何かを処分する必要がありますか?

+0

スタックトレースとは何ですか? – SLaks

+0

あなたはそれを削除した後にobjectLogでdisposeを呼び出そうとしましたか? –

+0

ログファイルを開いているアプリケーションが他に本当にありませんか? http://live.sysinternals.com/のprocmonとprocexpを使用して、どのアプリケーションがファイルにアクセスしているかを確認してください。 –

答えて

3

同じファイルを削除して再作成するのではなく、削除してもかまいませんか?このような

何かがあなたのために働く必要があります。

FileStream f = File.Open(@[filename], FileMode.Create); 
f.Close(); 
+0

これは他の人たちと同じように質問に答えませんが、私にはこの問題に対する解決策がありました。ありがとうございました。 –

+0

実際、FileMode.Createは既存のファイルを新しいファイルで上書きしますので、削除と再作成を1つの手順で処理すると主張できます。しかし、私は、ファイルが.Deleteの後にまだロックされている理由と、どれくらいの期間、それが好奇妙なのか、あなたの意見を理解しています。その解決策を私は他人に任せなければならない。あなたの直面する問題を解決するのを助けてくれてうれしいです。 – nycdan

0

あなたは再びファイルを作成する前に、ファイルを削除するためにSystem.IO.FileInfo.Deleteを使用して、System.IO.FileInfo.Refresh()ができ。リフレッシュでは、ファイルの再作成時に例外が発生しなくなります。または、nycdanが言うように、FileMode.Create列挙型を使用します。

+0

間違っています。 'Refresh()'は何の違いもありません。 'Refresh()'は 'FileInfo'インスタンスのプロパティを再チェックします。 – SLaks

6

私は詳細を知らないが、ファイル名が既存のファイルを削除した直後にレクリエーションのために利用できない理由のために多くの理由があります:削除操作は、まだオペレーティングシステムによって保留されている

  • は、
  • 削除に対応してファイルを開くウイルス対策プログラムまたは類似のセキュリティ機能
  • ウイルス対策プログラムまたは類似のセキュリティ機能が既に使用中にファイルを開いていて、あなたの削除要求への応答の進行中に

WindowsでもMercurialにこの問題がありました。一時ファイルを使用してリポジトリをロックしたコマンドを実行した後で、ロックする必要があるか、少なくともロックが存在しないことを確認する別のコマンドをすぐに実行すると、同じタイプのエラーで失敗する可能性があります。これは2つの別個のプロセスであり、最初のプロセスは既に終了していましたが、ファイルが使用されていました。言い換えれば

次のように、タイムラインだったが:

  • hg.exeインスタンス#1は、起動hg.exeはそれが
  • を行う必要がある何を
  • 一時ファイルを作成することで、リポジトリをロック
  • hg.exeがファイルを削除して、
  • hgを終了します。exeファイルインスタンス#2には、リポジトリをロックしようと、起動ファイルが使用中であるため

これは単にディレクトリ内で使用されていないランダムなファイル名を選択した「修正」するために彼らのハック、名前の変更失敗しますその名前にファイルを作成し、それを削除します。これにより、ファイルの問題が短期間で解決することはありませんでしたが、ファイル名を解放して、すぐに新しいファイルを利用できるようにしました。

+0

「FileShare.Delete」に気づいたことはありません。「このファイルに気づく前に、後でファイルを削除できるようになりました。」http://msdn.microsoft.com/en-us/library/windows/desktop/aa363915(v= vs.85).aspx: "ファイルの最後のハンドルが閉じられるまで、ファイルの削除は行われません。" –

4

そこはすでに受け入れ答えですが、おそらく誰かが、これは重宝(または私は再び何かを明らかに逃したし、完全に私の時間を無駄にしている場合、それを笑う)

私はFile.Deleteファイルを削除だろうどちらかという印象を持っていたし、このスレッドを読むまでは、例外を返すか、そうでなければ例外をスローします。

windows APIには、DeleteFileを呼び出すと、ファイルが開いているファイルに対してdeleteを呼び出すことができるため、ファイルは「閉じるときに削除マークされています。ファイルが削除マークされた後、ファイルを開く試行は「アクセス拒否」として失敗します。このファイルの最後のハンドルが閉じられると、ファイルは実際に削除されます。

窓が実際にこのコードは、ファイルがusingブロックの下に削除されていることを保証する理論的には、ファイルの最後のCloseHandle呼び出しから戻る前に、ファイルを削除した場合:

using (File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Delete)) 
{ 
    File.Delete(path); 
} 

別の場合File.Openが失敗しますプロセスは現在ファイルを開いています。

File.Deleteは、ファイルが存在しない場合(ディレクトリが存在しない場合を除き)、成功します。

+0

これは非常に興味深いです。選択された答えになるには十分な音かどうかわからないので投票します。私は他の人にチャイムをチャットさせます。 –

関連する問題