2009-12-30 3 views
2

Я использую библиотеку SharpSvn в приложении. В рамках моих автоматических тестов интеграции я создаю тестовый репозиторий, проверяю рабочую копию, выполняю некоторые тесты и удаляю как папки репозитория, так и рабочие папки.Невозможно программно удалить рабочую копию SVN

Однако простой Directory.Delete(workingCopyPath, true); всегда дает UnauthorizedAccessException с сообщением «доступа к пути„записи“отвергается.». Я могу воспроизвести ошибку с этим кодом:

 using (var svnClient = new SvnClient()) 
    { 
     svnClient.CheckOut(
      new SvnUriTarget(new Uri(repositoryPath)), workingCopyPath); 
    } 
    Directory.Delete(workingCopyPath, true); 

Эта ошибка возникает, если я

  • попытка удалить рабочую копию, созданную по предыдущим пробеге интеграции тесты
  • Thread.Sleep за несколько секунд до , пытающихся удалить

Если я использую проводник для ручного удаления временной рабочей копии, я не получаю никаких ошибок.

Что здесь общего не работает? Каков правильный способ программного удаления рабочей копии subversion?

+0

Вероятно, один из ваших интеграции автоматизированных процессов тестирования имеет свой текущий каталог установлен в каталог в рабочей копии, или по-прежнему с помощью файла в копии. – 2009-12-30 20:16:47

+0

Нет, поэтому я упоминаю, что я также не могу удалить рабочие копии, созданные * предыдущим * прогоном. Процессы предыдущего запуска больше не выполняются, поэтому я бы сказал, что он не может заблокировать какие-либо ресурсы. –

ответ

6

Оказалось, что Directory.Delete отказывается удалить файлы только для чтения.

я теперь использовать этот метод для удаления каталогов:

private void DeleteDirectory(string path) 
{ 
    var directory = new DirectoryInfo(path); 
    DisableReadOnly(directory); 
    directory.Delete(true); 
} 

private void DisableReadOnly(DirectoryInfo directory) 
{ 
    foreach (var file in directory.GetFiles()) 
    { 
     if (file.IsReadOnly) 
     file.IsReadOnly = false; 
    } 
    foreach (var subdirectory in directory.GetDirectories()) 
    { 
     DisableReadOnly(subdirectory); 
    } 
} 
+0

Этот способ должен работать хорошо, да. Кстати, вы должны быть способны принять свой собственный ответ. –