2017-09-30 5 views
0

フォルダ内のすべてのテキストファイルのパスをリストに読み込むアプリケーションで作業しています。各ファイルを読み取り、一時出力ファイルを作成し、元のファイルを一時出力ファイルで上書きし、一時出力ファイルを削除します。C# - コピーして上書きした後にファイルを削除することができません

{"The process cannot access the file '' because it is being used by another process."}

は、エラーがファイルごとに発生しませんが、ほんの数:私は次のエラーのため、一時出力ファイルを削除することができません

foreach (string lF in multipleFiles) 
    { 
     int lineNumber = 0; 
     using (StreamReader sr = new StreamReader(lF)) 
     { 
      using (StreamWriter sw = new StreamWriter(lF + "Output")) 
      { 
       while (!sr.EndOfStream) 
       { 

        //LOGIC 

        sw.WriteLine(line); 
       } 
      } 
     } 
     File.Copy(lF + "Output", lF, true); 
     //File.Delete(lF + "Output"); 
     try 
     { 

      File.Delete(lF + "Output"); <--- ERROR HERE 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 

は私のコードです。ファイルは開いていないか、他のアプリケーションによって使用されていません。

一時ファイルはどのように削除できますか?

UPDATE:File.Delete前に査読

Does FileStream.Dispose close the file immediately?に追加のThread.sleep(1)()、問題がまだ存在しています。睡眠の値を5に引き上げようとしました。

+0

関連があります:https://stackoverflow.com/questions/6350224/does-filestream-dispose-close-the-file-immediately –

+0

@someone Thread.Sleep(1)を追加しようとしました。エラーは引き続き発生します。私はさらに睡眠の値を5に増やしてみました。 – Tango

+2

50歳か500歳ですか? 1または5ミリ秒はあまりありません。 –

答えて

0

ウイルススキャナーまたはスタック内の他のドライバが、そのファイルまたはそのディレクトリエントリに保持されている可能性が常にあります。いくつかの再試行メカニズムを使用しますが、ファイル操作が不可分ではないため、そのファイルを削除できることを保証するものではありません。

var path = lf + "Output"; 
// we iterate a couple of times (10 in this case, increase if needed) 
for(var i=0; i < 10; i++) 
{ 
    try 
    { 
     File.Delete(path); 
     // this is success, so break out of the loop 
     break; 
    } catch (Exception exc) 
    { 
     Trace.WriteLine("failed delete #{0} with error {1}", i, exc.Message); 
     // allow other waiting threads do some work first 
     // http://blogs.msmvps.com/peterritchie/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program/ 
     Thread.Sleep(0); 
     // we don't throw, we just iterate again 
    } 
} 
if (File.Exists(path)) 
{ 
    // deletion still not happened 
    // this is beyond the code can handle 
    // possible options: 
    // store the filepath to be deleted on startup 
    // throw an exception 
    // format the disk (only joking) 
} 

コードは私のanswer hereからわずかに適合しましたが、それは別の文脈でありました。

関連する問題