C# - 复制和覆盖后无法删除文件

时间:2017-09-30 08:18:32

标签: c#

我正在开发一个应用程序,它将文件夹中所有文本文件的路径读入列表。它读取每个文件,创建临时输出文件,用临时输出文件覆盖原始文件并删除临时输出文件。

以下是我的代码:

    foreach (string lF in multipleFiles)
    {
        int lineNumber = 0;
        using (StreamReader sr = new StreamReader(lF))
        {
            using (StreamWriter sw = new StreamWriter(lF + "Output"))
            {
                while (!sr.EndOfStream)
                {

                    //LOGIC

                    sw.WriteLine(line);
                }
            }
        }
        File.Copy(lF + "Output", lF, true);
        //File.Delete(lF + "Output");
        try
        {

            File.Delete(lF + "Output"); <--- ERROR HERE
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

由于以下错误,我无法删除临时输出文件:

  

{&#34;该过程无法访问该文件&#39;&#39;因为它正在   由另一个进程使用。&#34;}

每个文件都不会发生错误,只会发生一些错误。所有文件都没有打开或被其他任何应用程序使用。

如何删除临时文件?

更新:参考Does FileStream.Dispose close the file immediately?

在File.Delete()之前添加了Thread.Sleep(1),问题仍然存在。试图将睡眠值增加到5.没有运气。

1 个答案:

答案 0 :(得分:0)

您始终存在堆栈中的病毒扫描程序或某些其他驱动程序仍保留该文件或其目录条目的风险。使用一些重试机制,但仍然不能保证您能够删除该文件,因为文件操作不是原子操作,因此任何进程都可以在您尝试删除它的调用之间打开该文件。

var path = lf + "Output";
// we iterate a couple of times (10 in this case, increase if needed)
for(var i=0; i < 10; i++) 
{
    try 
    {
        File.Delete(path);
        // this is success, so break out of the loop
        break;
    } catch (Exception exc) 
    {
         Trace.WriteLine("failed delete #{0} with error {1}", i, exc.Message);
         // allow other waiting threads do some work first
         // http://blogs.msmvps.com/peterritchie/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program/
         Thread.Sleep(0);
         // we don't throw, we just iterate again
    }
}
if (File.Exists(path)) 
{
    // deletion still not happened
    // this is beyond the code can handle
    // possible options:
    // store the filepath to be deleted on startup
    // throw an exception
    // format the disk (only joking)
}

代码略微改编自我的answer here但是在不同的背景下。