2017-09-06 5 views
0

私は、StreamReaderを使用した後にファイルを削除することができるように見えることはできませんStreamReaderを使用した後にファイルを削除することはできませんC#が

「ファイルが使用中であるため、ファイルにアクセスすることができません」

C#でエラーが発生しました。

私は何かを逃すかもしれないが、私は、ここにコードが何であるかを知らない:

fileEntries = from fullFilename 
    in Directory.EnumerateFiles(@"Data\csv\pending") 
    select Path.GetFileName(fullFilename); 

i = 1; 

foreach (string file in fileEntries) 
{ 
    if(i == 1) 
    { 
     folder = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\Data\csv\done"; 

     using (System.IO.FileStream fs = System.IO.File.Create(folder + @"\create-user.csv")) 
     { 

     } 

     using (System.IO.StreamWriter files = new System.IO.StreamWriter(folder + @"\create-user.csv", true)) 
     { 
      files.WriteLine(",; prenom; nom; username; pasword; email; question; reponse; GroupID"); 
     } 

     string curfile = @"\create-user-archive.csv"; 
     if(!(File.Exists(folder + curfile))) 
     { 
      using (System.IO.StreamWriter files = new System.IO.StreamWriter(folder + @"\create-user-archive.csv", true)) 
      { 
       files.WriteLine(",; prenom; nom; username; pasword; email; question; reponse; GroupID"); 
      } 
     } 
    } 


    folder = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\Data\csv\pending"; 
    sb = new StringBuilder(); 

    filef = new System.IO.StreamReader(folder + @"\create-user-" + i + ".csv"); 
    line = filef.ReadLine(); 

    while ((line = filef.ReadLine()) != null) 
    { 
     sb = new StringBuilder(); 
     sb.AppendLine(line.Substring(0, line.Length)); 
     folder = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\Data\csv\done"; 
     using (System.IO.StreamWriter files = new System.IO.StreamWriter(folder + @"\create-user.csv", true)) 
     { 
      files.WriteLine(",; " + sb.ToString().Split(';')[1] + ";" + sb.ToString().Split(';')[2] + ";" + sb.ToString().Split(';')[1] + "." + sb.ToString().Split(';')[2] + ";" + GenerateToken(6) + ";" + sb.ToString().Split(';')[3] + ";" + "1" + ";" + "1"); 
     } 

     folder = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\Data\csv\done"; 
     using (System.IO.StreamWriter files = new System.IO.StreamWriter(folder + @"\create-user-archive.csv", true)) 
     { 
      files.WriteLine(",; " + sb.ToString().Split(';')[1] + ";" + sb.ToString().Split(';')[2] + ";" + sb.ToString().Split(';')[1] + "." + sb.ToString().Split(';')[2] + ";" + GenerateToken(6) + ";" + sb.ToString().Split(';')[3] + ";" + "1" + ";" + "1"); 
     } 
    } 
    i++; 
    sourceFile = System.IO.Path.Combine(@"Data\csv\pending", file); 
    File.Delete(sourceFile); 
} 

ファイルは、StreamReaderを終了後に、使用中であることを停止べきではないのですか?ファイルを削除するためにファイルがロック解除されるまで待つ関数を使用しようとしましたが、無限になります。つまり、終了する必要のないプロセスが存在しますが、どちらが表示されないのでしょうか?

+0

どこで 'filef'を終了しますか? – EpicKip

+0

"ストリームリーダーが終了した後にファイルが使用中であってはなりませんか?"あなたは今、あなたがファイルの使用を終了したことをコンピュータがどのように知るべきですか?=!読者は 'Close'を呼び出す必要があります。それは記号です –

+0

同じファイルを複数回開いたり閉じたりしなかった場合、さまざまな方法で同じファイルやフォルダを参照すると、何が起きているのかが分かりやすくなります。たとえば、非常に汎用的な 'folder'変数を別のものに再利用するのではなく、' 'Data \ csv \ pending ''を参照する '' pendingFolder'と '' Data \ csv \' 'を参照する '' doneFolder''を作成します。完了しました。その値を_once_に設定し、後で同じパスをハードコーディングする代わりに実際にそれらの変数を使用します。 – Rhumborl

答えて

3

filefを閉じる必要があります。

using文でコードをラップすると、自動的にあなたがそれで行われたとき(ファイルを削除する前に)あなたが持っている

+0

本当に私はしませんでしたし、私のコードは読んでおらず、助けてくれてありがとう – raiskader

0

をfilef.Close()を呼び出し、また読者

using (System.IO.StreamReader filef = new System.IO.StreamReader(folder + @"\create-user-" + i + ".csv") { 
    ....yourcodehere 
} 

を閉じます作成したストリームを閉じてシステムリソースを破棄します。クラスがIDisposableインターフェイスを実装しているので、Closeメソッドまたはusingパターンを使用できます。私は第二の選択肢をお勧めします。

は、この記事を見を有していてもよい:https://stackoverflow.com/a/707339/6244709

+0

彼らはすでに開いているストリームをすべて閉じています( 'using'を使って)。 – cemper93

0

次を呼び出す必要があります。

filef.Close(); 

これは削除前に行われます。

while ((line = filef.ReadLine()) != null) 
      { 
       sb = new StringBuilder(); 
       sb.AppendLine(line.Substring(0, line.Length)); 
       folder = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\Data\csv\done"; 
       using (System.IO.StreamWriter files = new System.IO.StreamWriter(folder + @"\create-user.csv", true)) 
       { 
        files.WriteLine(",; " + sb.ToString().Split(';')[1] + ";" + sb.ToString().Split(';')[2] + ";" + sb.ToString().Split(';')[1] + "." + sb.ToString().Split(';')[2] + ";" + GenerateToken(6) + ";" + sb.ToString().Split(';')[3] + ";" + "1" + ";" + "1"); 
       } 

       folder = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\Data\csv\done"; 
       using (System.IO.StreamWriter files = new System.IO.StreamWriter(folder + @"\create-user-archive.csv", true)) 
       { 
        files.WriteLine(",; " + sb.ToString().Split(';')[1] + ";" + sb.ToString().Split(';')[2] + ";" + sb.ToString().Split(';')[1] + "." + sb.ToString().Split(';')[2] + ";" + GenerateToken(6) + ";" + sb.ToString().Split(';')[3] + ";" + "1" + ";" + "1"); 
       } 
      } 
      i++; 
      sourceFile = System.IO.Path.Combine(@"Data\csv\pending", file); 
      filef.Close(); 
      File.Delete(sourceFile);