Em um sistema de arquivos Windows NTFS, tenho um arquivo (digamos orig.mp3
). Abro este arquivo, por esse caminho orig.mp3
, de maneira que ele esteja em uso (por exemplo, reproduzindo-o no VLC).
Então eu crio um link físico ( cmd /c mklink /h link.mp3 orig.mp3
). Isso resulta em dois caminhos NTFS apontando exatamente para o mesmo arquivo.
Finalmente, tento excluir o arquivo vinculado novamente ( del link.mp3
ou excluir no Windows Explorer).
Isso falha com um erro: "O processo não pode acessar o arquivo porque está sendo usado por outro processo."
Por quê? E mais importante: como evitar isso (além de garantir que nenhum processo tenha o arquivo original em uso)? Posso dizer ao Windows para fazer uma 'exclusão atrasada', para que o arquivo vinculado seja excluído automaticamente quando o original não estiver mais em uso?
Respostas:
Esse é um comportamento bastante esperado, o link físico é apenas outro nome para o mesmo arquivo. Por exemplo, se você tiver o arquivo A.PDF, crie o link físico B.PDF para o mesmo arquivo, não importa se o arquivo é aberto com o nome A.PDF ou B.PDF - ainda é o mesmo arquivo. este arquivo é simplesmente aberto, você não pode excluir nenhum dos links.
O motivo real é que o nome é armazenado como um atributo no registro de arquivo da tabela de arquivos mestre (no caso de NTFS) e, como o arquivo é aberto, você não pode excluir nenhum dos links (não é possível modificar o arquivo aberto).
Nesse caso, não há nada como o arquivo original, pois os dois nomes pertencem ao mesmo (e o único) arquivo e os dois nomes são iguais. O arquivo é realmente excluído quando a contagem de links chega a zero.
fonte
Use a ferramenta FSUTIL para manter os links simbólicos com segurança.
http://technet.microsoft.com/en-ca/library/cc753059.aspx
removeria o hardlink preservando o orig.mp3
fonte
Error: The process cannot access the file because it is being used by another process.
Conforme detalhado na resposta de Robert Goldwein , esse link físico não pode ser excluído enquanto o arquivo estiver em uso. No entanto, uma exclusão atrasada acaba sendo possível.
O comentário de Damon sobre esta questão sugere o uso de movefile da Sysinternals Suite.
No meu caso, onde quero fazer isso no PowerShell, posso usar o de Lee Holmes , para que o Windows exclua o arquivo na próxima inicialização.
Move-LockedFile
link.mp3 $null
Ambas as opções acima usam a função Win32 MoveFileEx com o sinalizador MOVEFILE_DELAY_UNTIL_REBOOT .
Atualização: consulte https://gist.github.com/marnix/7565364 para uma
Remove-File-Eventually
que acabei de hackear. Sem garantias. :-)fonte