2017-09-06 115 views
0

我不能似乎能夠一個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'變量,而是創建一個名爲'pendingFolder'來引用'「Data \ csv \ pending」',另一個名爲'doneFolder'來引用''Data \ csv \完成「'。設置它們的值_once_,然後實際使用這些變量,而不是稍後對相同的路徑進行硬編碼。 – Rhumborl

回答

3

您需要關閉filef。

結束語代碼在using聲明將自動關閉讀者

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

另外,調用filef.Close(),當你用它做(在刪除文件之前)

+0

事實上我沒有,而且我的代碼也不是最容易閱讀的,感謝幫助 – raiskader

0

你有關閉您創建的流來處理系統資源。您可以使用Close方法或使用模式,因爲類實現了IDisposable接口。我會建議你到第二個選項。

可以看看這個帖子: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);