Ошибка «файл используется другим процессом» при попытке удалить файл базы данных - PullRequest
5 голосов
/ 28 августа 2011

У меня есть файл 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 ]

1 голос
/ 28 августа 2011

Вы можете попробовать запустить сборку мусора, запустив

GC.Collect();

Сделайте это после того, как вы закрыли и удалили объект БД.

Это, конечно, будет работать, только если это единственная ссылка на этот файл базы данных.

Изменить: Ответ на комментарий о том, что вы не должны использовать GC.Collect, чтобы "исправить" другие проблемы.

Не думаю, что это из-за другой проблемы. Сборщик мусора работает в неопределенное время, выбранное средой выполнения. Это означает, что вы не можете полагаться на то, что ваш объект находится между следующими строками.

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

Ваши варианты - принудительно собирать мусор или каким-либо образом задерживать удаление.

0 голосов
/ 29 августа 2011

Два приведенных выше ответа являются хорошими соображениями для обеспечения того, чтобы не ВАШЕ приложение использовало файл базы данных.

Я не совсем уверен, что такое файл .SDF, но быстрый поиск в Google показывает, что это может быть файл базы данных 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/

0 голосов
/ 29 августа 2011

Я бы попробовал вот так ниже. Это помещает ваше соединение в блок using, который вызывает удаление для вас соединения, как только оно выходит из области видимости. Это должно позволить вам удалить файл сразу после того, как все блокировки файлов, связанные с ним, должны быть сняты.

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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...