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

10

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.mp3ou 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?

MarnixKlooster ReinstateMonica
fonte
2
Provavelmente deve ser solicitado no superusuário. Mas ainda assim: movefile deve ser capaz de executar o truque em qualquer caso. É surpreendente que você não possa simplesmente excluir o link físico; na verdade, ele deve ser um arquivo completamente "não relacionado".
Damon

Respostas:

11

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.

Robert Goldwein
fonte
Obrigado por esta resposta a "Por quê?" Como você pode ver, adicionei minha própria resposta em "Como evitar?"
MarnixKlooster ReinstateMonica
4
O "porquê" está incompleto; se a exclusão de um link físico é uma modificação, o mesmo ocorre com a adição de um, mas você pode adicionar links físicos para abrir arquivos, mas não excluí-los ou renomeá-los. Eu acho que o "porquê" é que foi decidido que os hardlinks não podem ser renomeados ou excluídos enquanto um arquivo está aberto; uma decisão de design intencional.
RomanSt
2

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

http://technet.microsoft.com/en-ca/library/cc753059.aspx

fsutil reparsepoint delete link.mp3

removeria o hardlink preservando o orig.mp3

Stavr00
fonte
2
Mas isso funcionaria em links físicos? Eu não acredito nisso.
Daniel B
Bem ... eu entendi. Error: The process cannot access the file because it is being used by another process.
ST3
falhou. mesmo que @ ST3.
Señor CMasMas
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 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-LockedFilelink.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-Eventuallyque acabei de hackear. Sem garantias. :-)

MarnixKlooster ReinstateMonica
fonte