Auf einem Windows NTFS-Dateisystem habe ich eine Datei (z. B. orig.mp3
). Ich öffne diese Datei über diesen Pfad orig.mp3
so, 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.mp3
oder 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?
Antworten:
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.
quelle
Verwenden Sie das FSUTIL-Tool, um die Symlinks sicher zu pflegen.
http://technet.microsoft.com/en-ca/library/cc753059.aspx
würde den Hardlink entfernen, während orig.mp3 erhalten bleibt
quelle
Error: The process cannot access the file because it is being used by another process.
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-LockedFile
link.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. :-)quelle