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

时间:2011-08-28 18:10:05

标签: 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;
   }
}

我这样关闭它:

Conn.Close();
Conn.Dispose();

我尝试删除它:

if (File.Exists(@"\myPath\PC.sdf"))
    File.Delete(@"\myPath\PC.sdf");

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

3 个答案:

答案 0 :(得分:1)

您可以尝试通过运行

强制进行垃圾回收
GC.Collect();

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

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

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

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

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

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

答案 1 :(得分:0)

我会在下面尝试这样做。这会将您的连接放在一个使用块中,一旦它超出范围,它将调用为您配置连接。这应该允许您立即删除该文件,因为应该释放与之关联的所有文件锁。

bool OpenConn()
{
  try
  {
     using(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;
   }
}

if (File.Exists(@"\myPath\PC.sdf"))
    File.Delete(@"\myPath\PC.sdf");

答案 2 :(得分:0)

上述两个响应都是确保它不是您使用数据库文件的应用程序的良好考虑因素。

我不确定.SDF文件是什么,但快速谷歌搜索表明它可能是MS SQL数据库文件。如果是这样,根据您的系统和操作条件,您可能需要考虑使用ALTER DATABASE SET SINGLE_USER命令:

ALTER DATABASE [YourDbName]
SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

http://blog.sqlauthority.com/2010/02/11/sql-server-alter-database-dbname-set-single_user-with-rollback-immediate/