8

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.

Joey
  • 344,408
  • 85
  • 689
  • 683
Eugeniu Torica
  • 7,484
  • 12
  • 47
  • 62

4 Answers4

2

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.

Joey
  • 344,408
  • 85
  • 689
  • 683
  • As of Mar 2017 [Far Manager](http://svn.code.sf.net/p/farmanager/code/trunk/unicode_far/flink.cpp) uses [DeviceIoControl](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363216%28v=vs.85%29.aspx) function to change/edit either symlink or junction target(s). – Anton Krouglov Mar 01 '17 at 13:01
2

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.

Harry Johnston
  • 35,639
  • 6
  • 68
  • 158
  • Thank you, Harry. Never though that it is possible to have transaction. Unfortunately deprecation is a bad sign so I'm not sure I'll be able to use it. – Eugeniu Torica Jul 04 '12 at 21:18
1

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?

Community
  • 1
  • 1
LSerni
  • 55,617
  • 10
  • 65
  • 107
1

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.

Gyan
  • 85,394
  • 9
  • 169
  • 201
  • What does `/l` do? It's not listed for [Windows Server `copy`](https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/copy). – Tom Hale Aug 03 '20 at 07:43
  • 2
    Windows 7 `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.` – Gyan Aug 03 '20 at 10:53
  • This answer is brilliant. Why was it downvoted? If anything, @Gyan, you can add more details, like output of `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. – kevinarpe Dec 02 '22 at 08:43