C#无法删除文件
我不能似乎能够一个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完成后?我尝试使用一个函数,等待文件解锁以删除文件,但它是无限的,这意味着有一个永无止境的过程,我必须停止,但我看不到哪一个。
您需要关闭filef。
结束语代码在using
声明将自动关闭读者
using (System.IO.StreamReader filef = new System.IO.StreamReader(folder + @"\create-user-" + i + ".csv") {
....yourcodehere
}
另外,调用filef.Close(),当你用它做(在删除文件之前)
事实上我没有,而且我的代码也不是最容易阅读的,感谢帮助 – raiskader
你有关闭您创建的流来处理系统资源。您可以使用Close方法或使用模式,因为类实现了IDisposable接口。我会建议你到第二个选项。
他们已经关闭了几乎每一个他们打开的流(使用'using')。 – cemper93
您需要调用以下;
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);
你在哪里关闭'filef'? – EpicKip
“流媒体阅读器完成后,文件是否应该停止使用?”计算机应该如何知道你已经完成了使用该文件?=!你需要在阅读器上调用'Close'。这是标志 –
如果您不是多次打开和关闭相同的文件,并以各种方式引用相同的文件和文件夹,那么您会更容易看到发生了什么。例如,不是为了不同的事情重用通用的'folder'变量,而是创建一个名为'pendingFolder'来引用'“Data \ csv \ pending”',另一个名为'doneFolder'来引用''Data \ csv \完成“'。设置它们的值_once_,然后实际使用这些变量,而不是稍后对相同的路径进行硬编码。 – Rhumborl