刚删除后为什么我不能创建一个txt文件?

Fuz*_*ans 4 c# io logging delete-file

我的程序在启动时会创建一个日志文件.用户可通过设置"清除日志"选项,该选项调用删除日志文件的方法.

        //calls for a YesNo prompt to delete log or not
        result = objectMessageBox.ReturnDeleteLogPrompt();

        if (result == DialogResult.Yes)
        {
            //throw prompt
            if (File.Exists(objectLog.GetLogLocation()) == true)
            {
                try
                {                        
                    //delete the log file
                    File.Delete(objectLog.GetLogLocation());                        

                    //throw balloon tip saying log was cleared
                    ShowBalloonTip("LogCleared");
                }
                catch (Exception ee)
                {
                    MessageBox.Show("Error thrown deleting log: " + ee);
                    System.Windows.Forms.Clipboard.SetText(ee.ToString());
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

因为我已经完全删除了日志文件,所以我需要重新创建它.所以我调用一个方法:

try
        {
            //we create a new log file so it seems that the log has just been cleared
            objectLog.CreateLog();
        }
        catch (Exception ee)
        {
            MessageBox.Show("Error occured while clearing log:\n" + ee);
        }
Run Code Online (Sandbox Code Playgroud)

但是当它尝试重新创建日志文件时,会抛出一个错误,指出:

"System.IO.IOException:进程无法访问文件'~~',因为它正被另一个进程使用."

所以似乎在我调用删除文件时它一直在访问它?我打电话给我时需要处理什么file.delete吗?

ang*_*son 6

我不知道细节,但是有很多原因可以解释为什么在删除现有文件后文件名不能立即用于娱乐:

  • 删除操作仍由操作系统挂起
  • 防病毒程序或类似的安全功能打开文件以响应其被删除,以进行预删除分析
  • 您使用它时,防病毒程序或类似的安全功能已打开该文件,并且仍在响应您的删除请求

Mercurial也在Windows上遇到了这个问题.如果您执行了一个锁定存储库的命令(使用临时文件完成),然后立即执行另一个需要锁定的命令,或者至少确保没有锁定,那么它可能会因同一类型的错误而失败,文件正在使用中,即使这是两个不同的进程,第一个已经退出.

换句话说,时间表如下:

  • hg.exe实例#1启动,通过创建临时文件来锁定存储库
  • hg.exe做了它需要做的事情
  • hg.exe删除该文件,然后退出
  • hg.exe实例#2启动,尝试锁定存储库,因为文件正在使用而失败

他们"解决"这个问题的方法是简单地选择一个未在目录中使用的随机文件名,将文件重命名为该名称,然后将其删除.这并没有解决文件遗留一段时间的问题,但它确实释放了文件名并立即将其用于新文件.