2017-09-06 142 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);