Não pode excluir programaticamente a cópia de trabalho do SVN
Pergunta
Estou usando o Sharpsvn Biblioteca em um aplicativo. Como parte dos meus testes de integração automatizados, crio um repositório de teste, verifico uma cópia de trabalho, realizo alguns testes e excluo o repositório e as pastas de cópia de trabalho.
No entanto, um simples Directory.Delete(workingCopyPath, true);
sempre produz um UnauthorizedAccessException
com a mensagem "O acesso ao caminho 'entradas' é negado."Eu posso reproduzir o erro com este código:
using (var svnClient = new SvnClient())
{
svnClient.CheckOut(
new SvnUriTarget(new Uri(repositoryPath)), workingCopyPath);
}
Directory.Delete(workingCopyPath, true);
Este erro ainda ocorre se eu
- tente excluir uma cópia de trabalho criada por um anterior execução dos testes de integração
Thread.Sleep
alguns segundos antes de tentar excluir
Se eu usar o Explorer para excluir manualmente a cópia temporária de trabalho, não recebo nenhum erro.
o que há de errado aqui? Qual é a maneira correta de excluir programaticamente uma cópia de trabalho de subversão?
Solução
Acontece Directory.Delete
Recusa-se a excluir arquivos somente leitura.
Agora eu uso este método para excluir diretórios:
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);
}
}