C# — Access Denied Deleting a File — Procmon

Você escreveu seu código e na hora de testar você move, lê informações que fazem parte do arquivo ou cria um arquivo e depois que o processamento terminou você quer apagar o arquivo e se depara com o erro a seguir.

Access to the path ‘C:\Program Files\ReportingServices.Extension.dll’ is denied.

Então a primeira coisa que pensamos é: faltou usar using em algum lugar para que o Dispose pattern faça o seu trabalho. E aí você percebe que não é isso e abre-se um buraco no chão bem na sua frente. E agora qual é o processo que está rodando e usando o arquivo além do seu próprio software?

Procmon — Process Monitor — Sysinternals

O ano de 2020 eu ouvi muito sobre como usar ferramentas que apoiam na solução de problemas e de fato há várias que ajudam muito no dia a dia e a ferramenta Procmon é uma delas, você pode encontrar outras no site da Microsoft Sysinternals.

FILE LOCKED

Na primeira linha é exibido uma instrução ocorrida com o arquivo que eu queria excluir, chamada FILE LOCKED, eu não sabia o que significava, mas lembrei de algumas mensões do meu tech leader sobre lock de arquivos e fiz uma simples pesquisa para auxiliar no entendimento.

CANNOT DELETE

Esta última instrução é do meu software, que tentou excluir o arquivo e não conseguiu, pois o arquivo está em lock pelo Visual Studio.

Causas

Pesquisando um pouco mais, descobri que em um trecho do meu código eu lia o arquivo para pegar o número da versão para poder usar esta informação mais adiante e a forma com que eu estava enviando esta instrução fazia com que o arquivo ficasse em lock

Assembly assembly = Assembly.LoadFrom(@"C:\Program Files\ReportingServices.Extension.dll");
byte[] assemblyBytes = File.ReadAllBytes(@"C:\Program Files\ReportingServices.Extension.dll"); var assembly = Assembly.Load(assemblyBytes);