尝试删除数据库文件时"另一个进程正在使用的文件"错误

Gal*_*ali 5 c# winforms

我有一个PC.sdf与我合作的文件.我关闭连接,我需要删除它.

我这样打开连接:

bool OpenConn()
{
  try
  {
     Conn = new SqlCeConnection(String.Format(@"Data Source={0}\{1}", PathI, "PC.SDF"));
     Conn.Open();
     return true;
   }
   catch 
   {
      //MessageBox.Show(err.Message, "Connetion error");
      return false;
   }
}
Run Code Online (Sandbox Code Playgroud)

我这样关闭它:

Conn.Close();
Conn.Dispose();
Run Code Online (Sandbox Code Playgroud)

我试着像这样删除它:

if (File.Exists(@"\myPath\PC.sdf"))
    File.Delete(@"\myPath\PC.sdf");
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个错误:file in use by another process.可能是导致此错误的原因,我该如何解决?

Jes*_*alm 1

您可以尝试通过运行强制垃圾收集

GC.Collect();
Run Code Online (Sandbox Code Playgroud)

在关闭并处置数据库对象后执行此操作。

当然,只有当这是对该数据库文件的唯一引用时,这才有效。

编辑:回答关于您不应该使用 GC.Collect 来“修复”其他问题的评论。

我不认为这是因为另一个问题。垃圾收集器在运行时选择的不确定时间运行。这意味着您不能依赖在以下几行之间处理您的对象。

Conn.Dispose();
//Nothing says GC will run exactly now
File.Delete(@"C:\Some-file-used-by-Conn.db");
Run Code Online (Sandbox Code Playgroud)

您的选择是强制垃圾收集或以某种方式延迟删除。

  • 您应该避免调用 GC.Collect() 来尝试“修复”其他问题。这是一个不好的做法。 (5认同)
  • 我不确定 GC.Collect() 是否保证收集,它只请求 GC 进行清理。因此,在这种情况下,您可能仍然会收到错误,因为 GC 可能没有抽出时间来处理它。 (2认同)