Wie lösche ich einen Windows NTFS-Hardlink (mklink / h), während das Original verwendet wird?

10

Auf einem Windows NTFS-Dateisystem habe ich eine Datei (z. B. orig.mp3). Ich öffne diese Datei über diesen Pfad orig.mp3so, dass sie verwendet wird (z. B. durch Abspielen in VLC).

Dann erstelle ich einen harten Link ( cmd /c mklink /h link.mp3 orig.mp3). Dies führt dazu, dass zwei NTFS-Pfade auf genau dieselbe Datei verweisen.

Schließlich versuche ich, die verknüpfte Datei erneut zu löschen ( del link.mp3oder im Windows Explorer zu löschen).

Dies schlägt mit einem Fehler fehl: "Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird."

Warum? Und was noch wichtiger ist: Wie kann ich dies vermeiden (abgesehen davon, dass in keinem Prozess die Originaldatei verwendet wird)? Kann ich Windows möglicherweise anweisen, einen verzögerten Löschvorgang durchzuführen, damit die verknüpfte Datei automatisch gelöscht wird, wenn das Original nicht mehr verwendet wird?

MarnixKlooster ReinstateMonica
quelle
2
Sollte wohl auf Superuser gefragt werden. Aber trotzdem: movefile sollte auf jeden Fall den Trick machen können. Es ist überraschend, dass Sie den Hardlink nicht einfach löschen können, sondern dass es sich um eine vollständig "nicht verwandte" Datei handeln sollte.
Damon

Antworten:

11

Dies ist ein durchaus erwartetes Verhalten. Der Hardlink ist nur ein anderer Name für dieselbe Datei. Wenn Sie beispielsweise die Datei A.PDF haben, erstellen Sie eine feste Verknüpfung B.PDF mit derselben Datei. Es spielt keine Rolle, ob die Datei unter dem Namen A.PDF oder B.PDF geöffnet wird - es handelt sich also immer noch um dieselbe Datei Diese Datei wird einfach geöffnet, Sie können keinen der Links löschen.

Der eigentliche Grund ist, dass der Name als Attribut im Dateidatensatz der Stammdateitabelle gespeichert ist (im Fall von NTFS) und da die Datei geöffnet ist, können Sie keinen der Links löschen (Sie können die geöffnete Datei nicht ändern).

In diesem Fall gibt es nichts Vergleichbares wie die Originaldatei, da beide Namen zur selben (und der einzigen) Datei gehören und beide Namen gleich sind. Die Datei wird tatsächlich gelöscht, wenn die Anzahl der Links Null erreicht.

Robert Goldwein
quelle
Vielen Dank für diese Antwort auf "Warum?" Wie Sie sehen können, habe ich meine eigene Antwort zu "Wie vermeide ich?" Hinzugefügt.
MarnixKlooster ReinstateMonica
4
Das "Warum" ist unvollständig; Wenn das Löschen eines Hardlinks eine Änderung ist, gilt dies auch für das Hinzufügen eines Hardlinks. Sie können jedoch Hardlinks zu geöffneten Dateien hinzufügen, ohne sie zu löschen oder umzubenennen. Ich denke, das "Warum" ist nur, dass entschieden wurde, dass Hardlinks nicht umbenannt oder gelöscht werden können, während eine Datei geöffnet ist. eine absichtliche Entwurfsentscheidung.
RomanSt
2

Verwenden Sie das FSUTIL-Tool, um die Symlinks sicher zu pflegen.

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

fsutil reparsepoint delete link.mp3

würde den Hardlink entfernen, während orig.mp3 erhalten bleibt

Stavr00
quelle
2
Aber würde dies bei harten Links funktionieren? Ich glaube nicht.
Daniel B
Nun ... ich habe das verstanden. Error: The process cannot access the file because it is being used by another process.
ST3
Scheitern. wie @ ST3.
Señor CMasMas
1

Wie in der Antwort von Robert Goldwein ausführlich beschrieben , kann ein solcher fester Link nicht gelöscht werden, während die Datei verwendet wird. Ein verzögertes Löschen erweist sich jedoch als möglich.

Damons Kommentar zu dieser Frage schlägt vor, movefile aus der Sysinternals Suite zu verwenden.

In meinem Fall, in dem ich dies über PowerShell tun möchte, kann ich Lee Holmes verwenden , damit Windows die Datei beim nächsten Start löscht.Move-LockedFilelink.mp3 $null

Beide oben genannten verwenden die Win32 MoveFileEx-Funktion mit dem MOVEFILE_DELAY_UNTIL_REBOOT- Flag.

Update: Siehe https://gist.github.com/marnix/7565364 für ein Update,Remove-File-Eventually das ich gerade gehackt habe. Keine Garantien. :-)

MarnixKlooster ReinstateMonica
quelle