C# 在使用 StreamReader 后无法删除文件

C# can't delete file after streamreader use

我似乎无法在使用流阅读器后删除文件,

"file can't be accessed because file is in use"

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 语句中将自动关闭 reader

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

或者,在完成后调用 filef.Close()(在删除文件之前)

您必须关闭您创建的流以释放系统资源。您可以使用 Close 方法或使用模式,因为 类 实现了 IDisposable 接口。我建议您选择第二个选项。

可以看看这个 post:

您需要调用以下内容;

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);