How can I change target of already existing symbolic link. Any solution would work: console, powershell,etc.
Important think is to make this change atomically so solution to delete link and then create a new one do not work for me.
How can I change target of already existing symbolic link. Any solution would work: console, powershell,etc.
Important think is to make this change atomically so solution to delete link and then create a new one do not work for me.
This seems to be possible with the ZwFsControlFile
function using the FSCTL_SET_REPARSE_POINT
control code. At least that's what I gleaned from how Far Manager does it via Process Monitor.
You could use transactional NTFS. See the following functions:
The downside is that MS are deprecating support for transactions. In particular transactions are not available in the new file system being introduced in Windows Server 2012.
You can try creating a new symbolic link, and then renaming the new link to overwrite the old.
There are some possibilities mentioned here:
Is an atomic file rename (with overwrite) possible on Windows?
A slight modification of LSemi's method works for me in Windows 7 CMD console
mklink TempLink NewTarget
copy /l /y TempLink OldLink
del TempLink
I've a process that reads OldLink multiple times a second and with this method I'm able to continuously update OldLink to new targets without causing a read error. Strictly speaking, this isn't probably atomic but the time taken to effect the symlink copy must be so small, that it doesn't interfere.
/l
do? It's not listed for Windows Server copy
. –
Gerianne copy /?
shows this /L If the source is a symbolic link, copy the link to the target instead of the actual file the source link points to.
–
Bioastronautics dir
to show exactly how the file system changes after each step. I tested your steps: In a separate Cygwin window, I run a simple infinite loop: while true; do cat symlink.txt; done
. Then I used your trick to update symlink.txt
to point to different file. Never once did my infinite read file loop fail. Works perfectly. I wonder how copy
executes this operation! It is annoying that MKLINK
does not have a /F
(force) option to do the same. UNIX has it. –
Anyways © 2022 - 2024 — McMap. All rights reserved.