Comment supprimer le lien dur Windows NTFS (mklink / h) lorsque l'original est en cours d'utilisation?

10

Sur un système de fichiers Windows NTFS, j'ai un fichier (disons orig.mp3). J'ouvre ce fichier, par ce chemin orig.mp3, de telle manière qu'il est utilisé (disons, en le lisant dans VLC).

Ensuite, je crée un lien dur ( cmd /c mklink /h link.mp3 orig.mp3). Il en résulte deux chemins NTFS pointant vers exactement le même fichier.

Enfin, j'essaie de supprimer à nouveau le fichier lié ( del link.mp3, ou supprimer dans l'Explorateur Windows).

Cela échoue avec une erreur: "Le processus ne peut pas accéder au fichier car il est utilisé par un autre processus."

Pourquoi? Et plus important encore: comment puis-je éviter cela (en dehors de m'assurer qu'aucun processus n'a le fichier d'origine en cours d'utilisation)? Puis-je peut-être dire à Windows de faire une «suppression différée», afin que le fichier lié soit automatiquement supprimé lorsque l'original n'est plus utilisé?

MarnixKlooster ReinstateMonica
la source
2
Devrait probablement être demandé au superutilisateur. Mais quand même: movefile devrait pouvoir faire l'affaire dans tous les cas. Il est surprenant que vous ne puissiez pas simplement supprimer le lien dur, en fait, il devrait s'agir d'un fichier complètement "indépendant".
Damon

Réponses:

11

C'est un comportement très attendu, le lien dur est juste un autre nom pour le même fichier. Par exemple, si vous avez un fichier A.PDF, créez un lien dur B.PDF vers le même fichier, peu importe si le fichier est ouvert sous le nom A.PDF ou B.PDF - c'est toujours le même fichier, donc si ce fichier est simplement ouvert, vous ne pouvez supprimer aucun des liens.

La raison réelle est que le nom est stocké en tant qu'attribut dans l'enregistrement de fichier de la table de fichiers maîtres (dans le cas de NTFS) et puisque le fichier est ouvert, vous ne pouvez supprimer aucun des liens (vous ne pouvez pas modifier le fichier ouvert).

Dans ce cas, rien de tel que le fichier d'origine, car les deux noms appartiennent au même (et le seul) fichier et les deux noms sont égaux. Le fichier est réellement supprimé lorsque le nombre de liens atteint zéro.

Robert Goldwein
la source
Merci pour cette réponse à "Pourquoi?" Comme vous pouvez le voir, j'ai ajouté ma propre réponse sur "Comment éviter?"
MarnixKlooster ReinstateMonica
4
Le «pourquoi» est incomplet; si la suppression d'un lien dur est une modification, il en va de même pour l'ajout d'un, mais vous pouvez ajouter des liens durs pour ouvrir des fichiers, mais pas les supprimer ou les renommer. Je pense que le "pourquoi" est simplement qu'il a été décidé que les liens physiques ne peuvent pas être renommés ou supprimés pendant qu'un fichier est ouvert; une décision de conception intentionnelle.
RomanSt
2

Utilisez l'outil FSUTIL pour gérer les liens symboliques en toute sécurité.

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

fsutil reparsepoint delete link.mp3

supprimerait le lien dur tout en préservant orig.mp3

Stavr00
la source
2
Mais cela fonctionnerait-il sur des liens durs? Je ne le crois pas.
Daniel B
Eh bien ... j'ai compris. Error: The process cannot access the file because it is being used by another process.
ST3
échouer. comme @ ST3.
Señor CMasMas
1

Comme détaillé dans la réponse de Robert Goldwein , un tel lien dur ne peut pas être supprimé lorsque le fichier est en cours d'utilisation. Cependant, une suppression différée s'avère possible.

Le commentaire de Damon sur cette question suggère d'utiliser le fichier de déplacement de la suite Sysinternals.

Dans mon cas, où je veux le faire à partir de PowerShell, je peux utiliser celui de Lee Holmes , pour que Windows supprime le fichier au prochain démarrage.Move-LockedFilelink.mp3 $null

Les deux ci-dessus utilisent la fonction Win32 MoveFileEx avec l' indicateur MOVEFILE_DELAY_UNTIL_REBOOT .

Mise à jour: Voir https://gist.github.com/marnix/7565364 pour un Remove-File-Eventuallyque je viens de pirater. Aucune garantie. :-)

MarnixKlooster ReinstateMonica
la source