Como excluir o hard link do Windows NTFS (mklink / h) enquanto o original está em uso?

8

Em um sistema de arquivos do Windows NTFS, eu tenho um arquivo (digamos, orig.mp3 ). Eu abro este arquivo, através deste caminho orig.mp3 , de tal forma que ele está em uso (digamos, jogando-o em VLC).

Em seguida, 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.

Por fim, 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 posso evitar isso (além de garantir que nenhum processo tenha o arquivo original em uso)? Posso, talvez, dizer ao Windows para fazer uma 'exclusão atrasada', para que o arquivo vinculado seja automaticamente excluído quando o original não estiver mais em uso?

    
por Marnix Klooster 20.11.2013 / 13:20

3 respostas

9

Isso é 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, então se este arquivo é simplesmente aberto, você não pode excluir nenhum link.

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 link (não é possível modificar arquivo).

Nesse caso, não há nada como o arquivo original, já que 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 atinge zero.

    
por 20.11.2013 / 14:06
3

Use a ferramenta FSUTIL para manter os links simbólicos com segurança.

link

fsutil reparsepoint delete link.mp3

removeria o hardlink preservando orig.mp3

    
por 30.10.2014 / 17:59
1

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 é possível.

O comentário de Damon sobre essa questão sugere o uso de movefile da suíte Sysinternals.

No meu caso, onde eu quero fazer isso no PowerShell, posso usar o Move-LockedFile link.mp3 $null , para que o Windows exclua o arquivo na próxima inicialização.

As duas opções acima usam a função Win32 MoveFileEx com o MOVEFILE_DELAY_UNTIL_REBOOT bandeira.

Atualização: veja link para um Remove-File-Eventually que eu acabei de hackear. Sem garantias. : -)

    
por 20.11.2013 / 15:11