Символьные ссылки windows удалить

I am having issues when removing SymbolicLinks which I have created with New-Item:

   New-Item -ItemType SymbolicLink -Path C:\SPI -Target "C:\Users\Chino\Dropbox (Reserve Membership)\"
  
  

I need to modify the link because it has the wrong -Target
, which should be:

   New-Item -ItemType SymbolicLink -Path C:\SPI -Target "C:\Users\Chino\Dropbox (Reserve Membership)\SPI"
  
  

How to remove that link and assign a new one? Alternatively, how to update the target path of the existing link?

sɐunıɔןɐqɐp's user avatar

15 gold badges
35 silver badges
40 bronze badges

asked Aug 6, 2017 at 21:42

thebusiness11's user avatar

Calling Delete()
on the corresponding DirectoryInfo object should do the trick:

   (Get-Item C:\SPI).Delete()
New-Item -ItemType SymbolicLink -Path C:\SPI -Target "C:\Users\Chino\Dropbox (Reserve Membership)\SPI"
  
  

answered Aug 6, 2017 at 23:26

Mathias R. Jessen's user avatar

Mathias R. Jessen
Mathias R. Jessen

12 gold badges
147 silver badges
205 bronze badges

   New-Item -ItemType SymbolicLink -Path C:\SPI -Target "C:\Users\Chino\Dropbox (Reserve Membership)\SPI" -Force
  
  

answered Aug 6, 2017 at 23:40

Lance U. Matthews's user avatar

No way to update the symbolic link as far as I know. Gotta use CMD to remove symbolic link and you could then re-create it using your powershell script. You would do it like this in powershell.

   cmd /c "rmdir C:\SPI"
  
  

answered Aug 6, 2017 at 23:05

Luisrorta's user avatar

i want to delete some symbolic Links (Folder). I tried

   (Get-Item "C:\Users\MIKROEG\AppData\Roaming\Microsoft\Windows\Network Shortcuts\*.*").Delete()
  
  
   [string]$Nutzerpfad = "$env:APPDATA"
[string]$Destination = "$Nutzerpfad\Microsoft\Windows\Network Shortcuts\*.*"
[System.IO.Directory]::Delete($Destination, $true)
  
  
   cmd /s rmdir C:\Users\MIKROEG\AppData\Roaming\Microsoft\Windows\Network Shortcuts\Test2
  
  
   $alleordneranzeigen=Get-ChildItem -Path $Destination -Directory
foreach($ordner in $alleordneranzeigen)
{ Remove-Item -Path $ordner.FullName
}
  
  

but nothing works.
The last one wants to delete recurse.

Can anyone help me?

asked Jul 20, 2020 at 19:05

Michael's user avatar

1 gold badge
1 silver badge
6 bronze badges

A directory symbolic link, typically created using mklink /D mysymlink C:\myfiles\somefile
at the command line, can be removed like a directory using

You may demonstrate this by making a backup copy of the directory in File Explorer, and using the rd
command on your directory symlink. You will see that the symlink is removed, and the original directory and its contents are still present.

Warning about trying other ways:
a directory symbolic link cannot be deleted like a file
at the command line, using del
. Doing so deletes the files in the directory!

answered Oct 2, 2021 at 20:53

Reg Edit's user avatar

Reg Edit

1 gold badge
35 silver badges
46 bronze badges

In order to properly
delete symbolic links using

you can just delete the symbolic link inside of windows explorer. This way you do not even need to bother using powershell.

If you are looking to delete the link with powershell DO NOT use

Instead target the designated folder like this:

cmd /c rmdir .\Target

answered Jul 20, 2020 at 19:38

Zain's user avatar

1 silver badge
12 bronze badges

Символьная (символическая) ссылка (также симлинк от англ. Symbolic link) — специальный файл в файловой системе, для которого не формируются никакие данные,
кроме одной текстовой строки с указателем. Ссылка может указывать на файл, каталог или даже несуществующий файл. Основное назначение символьных ссылок – создание удобной
структуры файлов и каталогов в файловой системе. Ссылки позволяют для одного файла или каталога иметь несколько имён, абсолютно никак не связанных с именами файлов или каталогов, на которые они ссылаются.
На практике, символьные ссылки используются для подключения в нужное место файловой системы файлов или папок, расположенных в произвольных местах, а
также для связывания содержимого с конкретным именем файла или каталога. Например, для подключения к каталогу, обслуживаемому FTP-сервером,
съемного диска (флэшки) для временной раздачи по FTP. Вместо копирования содержимого флэшки, можно в домашнем каталоге сервера создать символьную ссылку, ссылающуюся на ее содержимое.

Формат командной строки MKLINK:

Параметры командной строки:

/D
– Создание символической ссылки на каталог. По умолчанию создается символическая ссылка на файл.

/H
– Создание жесткой связи (hard link)вместо символической ссылки.

/J
– Создание соединения для каталога.

Ссылка
– Имя новой символической ссылки.

Назначение
– Путь (относительный или абсолютный), на который ссылается создаваемая ссылка.

mklink /?
– отобразить подсказку по использованию команды.

mklink /D slnk1 D:\
– создать в текущем каталоге символьную ссылку с именем slnk1
, ссылающуюся на корневой каталог диска D:

mklink /D C:\mountpoint\ShC \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\
– создать символическую ссылку с именем ShC
в каталоге mountpoint
на диске C:
, ссылающуюся на теневую копию (мгновенный снимок) диска.

При работе с каталогами, параметр /J
и параметр /D
имеют одинаковый результат.

Для удаления созданных символических ссылок можно воспользоваться стандартными командами командной строки Windows:

erase lnkfile1
– удалить символьную ссылку на файл. Сам файл, на который ссылается ссылка, не удаляется.

del lnkfile1
– то же, но с использованием команды del

rmdir C:\mountpoint\ShC
– удаление символической ссылки на каталог. Сам каталог не удаляется. Обратите внимание, что использование команды del
для файлов внутри каталога, на который ссылается ссылка, приводит к их удалению.

erase C:\mountpoint\ShC\lile1.txt
– удалить файл из каталога, определенного символической ссылкой.

mklink /H hm histmacros.cmd
– создать жесткую ссылку с именем hm
, ссылающуюся на файл histmacros.cmd
. Жесткие ссылки могут создаваться только в пределах одного раздела. Нельзя создать жесткую ссылку, например, командой:

mklink /H C:\mountpoints\hm D:\SCRIPTS\histmacros.cmd

И жесткая ссылка, и файл, на который она ссылается, должны быть на одном и том же логическом диске.


Весь список команд CMD Windows

Время на прочтение

Предыстория

В своём топике ” Впечатления от Яндекс. Субботника
” хабрачеловек absolvo
высказал удивление, что один из докладчиков не знал о том, что символьные ссылки есть и в Windows. Честно говоря, не знал этого и я, поэтому поинтересовался об этих ссылках в комментариях
.

Думаю, то, что удалось выяснить, может показаться кому-нибудь полезным.

Символьные ссылки windows удалить

Сразу оговорюсь, что под ссылками в Windows я понимаю ссылки в NTFS. В FAT механизмов ссылок, насколько мне известно, предусмотрено не было.

Ядро Windows поддерживает следующие виды ссылок:

  • Hard Links — жёсткие ссылки, как в *nix. Доступны начиная с Windows NT4.
  • Junction Points — аналог символических ссылок. Доступен начиная с Windows 2000 (NTFS 5).
  • Symbolic Links — символьные ссылки. Доступны начиная с Windows Vista.

Если вы никогда не имели дела с символическими и жёсткими ссылками, но хотели бы узнать о них, советую прочитать отрывок из документации файлового менеджера FAR
, спасибо хабрачеловеку allemeine
. Там говорится только о Hard Links и Junction Points, но этого вполне достаточно. Symbolic Links действуют так же, как и Junction Points, с той разницей, что могут указывать на файлы (и реализованы в Windows по-другому).

Hard Links можно создавать только на файлы, Junction Points — только на директории, Symbolic Links — на файлы и директории. В дальнейшем под «жёсткими ссылками» подразумеваются Hard Links, под «символьными» — Junction Points и Symbolic Links.

Жёсткие ссылки действительны в пределах одного раздела, символьные — могут пересекать границы разделов. В связи с этим символьные ссылки могут поломаться, если структуру разделов поменять.

:/>  Напишите в hosts это где и Файл hosts это где находится, как он должен выглядеть, как редактировать и сохранять

Не со всем, что поддерживается ядром, умеет нормально работать эксплорер. Будьте осторожны при использовании Junction Points в версиях Windows до Vista. При удалении Junction Point эксплорер может залезть внутрь директории, на которую ссылается Junction Point и поудалять там всё, а затем удалить Junction Point, хотя должен лишь удалить ссылку. Наверняка могут возникнуть проблемы и при перемещении или копировании Junction Point’ов.

Мне неизвестно, нормально ли в версиях Windows до Vista относятся к Junction Points стандартные утилиты типа rmdir.

Дополнительные материалы по теме

По словам хабрачеловека SamDark
, хорошее описание всех видов ссылок есть ещё в справке по NTFS Links (дополнению для Total Commander, см. ниже).

Софт

Утилиты от Microsoft

Windows >= Vista

В Windows Vista добавили команду mklink
для создания символьных и жёстких ссылок (спасибо за информацию хабрачеловеку metamorph
).

Windows >= 2000

fsutil hardlink create ссылка файл

Создаёт Hard Link на файл ( источник
).

linkd ссылка директория

Создаёт Junction Point на директорию ( источник
). Утилита входит в Microsoft Windows Resources Kit
.

Расширения для Explorer

NTFS Link
интегрируется в Explorer и добавляет во всплывающее меню, появляюшееся после перетаскивания правой кнопкой мыши, пункты «Create junction point» и «Create hard link». Кроме того, она перехватывает вызовы Explorer’а, обеспечивая нормальное перемещение/копирование/удаление созданных ссылок.

NTFS Links — дополнение для Total Commander

Страница программы
(за информацию спасибо хабрачеловеку SamDark
). Плагин может запускаться как отдельная программа, вне Total Commander’а.

FAR
Junction Link Magic
Junction — консольная программа для создания Junction Points

UPD
: обновил топик с учётом комментариев.

I have a symlink to an important directory. I want to get rid of that symlink, while keeping the directory behind it.

I tried rm
and get back rm: cannot remove 'foo'
.

I tried rmdir
and got back rmdir: failed to remove 'foo': Directory not empty

I then progressed through rm -f
, rm -rf
and sudo rm -rf

Then I went to find my back-ups.

Is there a way to get rid of the symlink without throwing away the baby with the bathwater?

asked Oct 16, 2008 at 20:18

Matthew Scouten's user avatar

Matthew Scouten

9 gold badges
33 silver badges
50 bronze badges

   # this works:
rm foo
# versus this, which doesn't:
rm foo/
  
  

Basically, you need to tell it to delete a file
, not delete a directory
. I believe the difference between rm
and rmdir
exists because of differences in the way the C library treats each.

At any rate, the first should work, while the second should complain about foo being a directory.

If it doesn’t work as above, then check your permissions. You need write permission to the containing directory to remove files.

Zeke Lu's user avatar

1 gold badge
16 silver badges
23 bronze badges

answered Oct 16, 2008 at 20:22

Matthew Scharley's user avatar

Matthew Scharley

52 gold badges
194 silver badges
222 bronze badges

use the “unlink” command and make sure not
to have the / at the end

       $ unlink mySymLink
  
  

unlink() deletes a name from the file system. If that name was the last link to a file and no processes have the file open the file is deleted and the space it was using is made available for reuse.

If the name was the last link to a file but any processes still have the file open the file will remain in existence until the last file descriptor referring to it is closed.

I think this may be problematic if I’m reading it correctly.

If the name referred to a symbolic link the link is removed.

If the name referred to a socket, fifo, or device the name for it is removed but processes that have the object open may continue to use it.

AsukaMinato's user avatar

ответил 16 окт 2008 в 20:22

Joe Phillips's user avatar

Джо Филлипс

31 золотой значок
103 серебряных знака
159 бронзовых знаков

rm
следует удалить символическую ссылку.

 skrall@skrall-desktop:~$ mkdir bar
skrall@skrall-desktop:~$ ln -s bar foo
skrall@skrall-desktop:~$ ls -l foo
lrwxrwxrwx 1 skrall skrall 3 2008-10-16 16:22 foo -> bar
skrall@skrall-desktop:~$ rm foo
skrall@skrall-desktop:~$ ls -l foo
ls: cannot access foo: No such file or directory
skrall@skrall-desktop:~$ ls -l bar
total 0
skrall@skrall-desktop:~$

  

user16217248's user avatar

18 золотых значков
19 серебряных значков
37 бронзовых знаков

ответил 16 окт 2008 в 20:24

Steve K's user avatar

Стив К.

6 золотых значков
52 серебряных знака
50 бронзовых знаков

Использовать rm symlinkname
но не добавляйте косую черту в конце (не используйте: rm symlinkname/
). Затем вас спросят, хотите ли вы удалить символическую ссылку y.
ответить да.

Brad's user avatar

54 золотых знака
349 серебряных значков
530 бронзовых знаков

ответил 21 августа 2012 в 21:13

DeeEss09's user avatar

2 серебряных значка
2 бронзовых знака

Предположим, что это символическая ссылка,

 $ rm -d symlink

  

Он должен понять это, но поскольку он не может, мы активируем скрытый код, предназначенный для другого случая, которого больше не существует, но здесь он работает правильно.

ответил 16 окт 2008 в 22:29

Joshua's user avatar

8 золотых значков
72 серебряных значка
129 бронзовых знаков

Если rm не может удалить символическую ссылку, возможно, вам нужно посмотреть права доступа к каталогу, содержащему символическую ссылку. Чтобы удалить записи каталога, вам необходимо разрешение на запись в содержащем каталоге.

ответил 16 окт 2008 в 20:21

Greg Hewgill's user avatar

Грег Хьюгилл

183 золотых значка
1146 серебряных значков
1282 бронзовых знака

Предполагая, что ваша установка выглядит примерно так: ln -s /mnt/bar ~/foo
, то вы сможете сделать rm foo
без проблем. Если вы не можете, убедитесь, что вы являетесь владельцем foo
и иметь разрешение на запись/выполнение файла. Удаление foo
не тронет bar
, если вы не сделаете это рекурсивно.

ответил 16 окт 2008 в 20:23

TJ L's user avatar

ТД Л

7 золотых значков
59 серебряных значков
77 бронзовых знаков

У меня тоже была такая же проблема. Так что предлагаю попробовать unlink <absolute path>
.

U. Windl's user avatar

26 серебряных значков
54 бронзовых знака

ответил 3 ноя 2020 в 18:59

rubel Mazumder's user avatar

В CentOS просто запустите rm linkname
и он попросит «удалить символическую ссылку?». Тип Y
и Введите
, ссылка исчезнет, ​​и каталог будет в безопасности.

JasonMArcher's user avatar

22 золотых значка
56 серебряных значков
52 бронзовых знака

ответил 17 сен 2014 в 19:23

Yuri's user avatar

У меня была эта проблема с MinGW (на самом деле Git Bash), работающим на Windows Server. Ни одно из приведенных выше предложений не сработало. В конце концов, он сделал копию каталога на случай, если затем удалил программную ссылку в проводнике Windows, а затем удалил элемент из корзины. Он издавал звуки, как будто удалял файлы, но не удалял. Но сделайте резервную копию!

ответил 30 января 2018 в 8:39

Keith Whittingham's user avatar

можно использовать отсоединить
в папке, где вы создали свою символическую ссылку

ответ дан 10 окт 2020 в 4:08

R. Pandey's user avatar

Если rm
не может удалить ссылку, возможно, вам нужно посмотреть права доступа к каталогу, содержащему ссылку. Чтобы удалить записи каталога, вам необходимо разрешение на запись в содержащем каталоге.

:/>  Процесс Wsappx - причина нагрузки на диск и как исправить в Windows 10 - Starus Recovery - 2021 год

buddemat's user avatar

14 gold badges
29 silver badges
49 bronze badges

answered Oct 10, 2022 at 13:08

sharmin sultana's user avatar

windows-hardlink-and-symlink-000.png
Жесткие и символические ссылки давно знакомы и активно используются Linux-администраторами, в то время как их Windows коллеги используют их гораздо реже, а некоторые вообще не знают о такой возможности. Тем не менее такая возможность в Windows существует и позволяет значительно упростить некоторые сценарии работы с папками и файлами. В данной статье мы рассмотрим все виды ссылок, доступные в среде ОС Windows, а также разные способы работы с ними, начиная от командной строки и заканчивая PowerShell.


Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik
. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.

Жесткие ссылки (HardLink)

Жесткие ссылки представляют собой дополнительную запись в файловой таблице раздела для существующего файла. Таким образом жесткая ссылка ничем не отличается от исходного файла, но файл при этом не копируется физически и остается на диске в единственном экземпляре. При изменении файла по любой из жестких ссылок, остальные обновляются автоматически (что логично, так как файл один).

Мы можем переименовывать, копировать, перемещать (в пределах логического тома) ссылки – размер занимаемого места при этом не изменится. При удалении ссылок файл продолжает существовать до тех пор, пока не будет удалена последняя жесткая ссылка на него. Фактически отличить, где находится оригинальный файл, а где жесткая ссылка невозможно, по сути, файл на разделе это и есть жесткая ссылка.

Жесткая ссылка может существовать только в пределах логического тома, поддерживается файловыми системами NTFS и ReFS начиная со сборки 19536.

Для создания жесткой ссылки можно воспользоваться утилитой mklink
:

   mklink /H C:\Folder1\LinkFileName C:\Folder\FileName  
  

Где ключ /H
предписывает создать именно жесткую ссылку, далее следует путь к новому файлу и целевому файлу, на который мы делаем ссылку. Путь можно указывать как абсолютные, так и относительные, в имени создаваемого файла не забывайте указывать расширение.

windows-hardlink-and-symlink-001.png

Ссылки можно создавать и при помощи PowerShell
, для этого воспользуйтесь командой:

   New-Item -ItemType HardLink -Path C:\Folder1\LinkFileName -Target C:\Folder\FileName  
  

Команда другая, но принцип тот же самый: -ItemType
– тип создаваемой ссылки, в нашем случае жесткая ссылка, -Path
– путь к создаваемому файлу ссылки, -Target
– файл на который мы делаем ссылку.

windows-hardlink-and-symlink-002.png

Можно ли сделать жесткую ссылку на директорию? Нет, только на файлы.

Вроде бы все понятно, но если внимательный читатель заглянет в свойства папки с жесткой ссылкой, то он увидит, что ее размер равен исходному файлу, если сделаем в ней еще одну жесткую ссылку – двум исходным файлам. Как так? Не стоит переживать, все нормально. Для операционной системы жесткая ссылка ничем не отличается от обычного файла и при подсчете свободного места учитывается размер каждой ссылки, но на самом деле на диске хранится единственная копия. В этом можно убедиться, если одновременно с созданием жестких ссылок контролировать свободное место на диске.

При желании мы можем провернуть даже такой фокус:

windows-hardlink-and-symlink-003.png

Какой вывод можно сделать из того, что мы увидели и где нам могут пригодиться жесткие ссылки? Прежде всего для предоставления пользователям доступа к объемным архивам, образам или инсталляционным пакетам. Скажем у вас есть файловый сервер и несколько отделов, каждому из которых нужно предоставить доступ к одному и тому же большому файлу. При этом вы можете не бояться, что кто-то удалит файл, он удалит его только у себя в директории, для остальных пользователей он останется доступен.

Но при этом надо очень внимательно относиться к вопросу одновременного редактирования файла, так как он существует в единственном экземпляре, но доступен по множеству ссылок в этом сценарии могут возникнуть самые разные коллизии.

Точки соединения (Junction)

Очень старая технология, поддерживаемая еще начиная с Windows 2000, позволяет сделать один из каталогов псевдонимом другого каталога. Чем-то напоминает символические ссылки, но в крайне упрощенном варианте. В качестве цели можно использовать только локальные папки, но при этом нет ограничения по размещению их на одном томе. Т.е. целевая папка может находиться на диске C:, а точка соединения для нее на диске D: и все будет работать. Точки соединения поддерживаются файловыми системами NTFS и ReFS.

Для создания точки соединения можно использовать mklink
:

   mklink /J D:\LinkFolder C:\Folder  
  

Ключ /J
указывает на создание точки соединения, далее следует папка каталога-псевдонима и папка целевого каталога. При любом изменении целевого каталога (перемещение, переименование, удаление) точка соединения перестает работать.

Обратите внимание, что данная папка в проводнике отображается как ярлык, а выводе команды dir
как точка соединения.

windows-hardlink-and-symlink-004.png

Это же действие в PowerShell
:

   New-Item -ItemType Junction -Path D:\LinkFolder -Target C:\Folder  
  

Комментировать здесь особо нечего, краткость не входит в число добродетелей PowerShell, но не оставляет места догадкам, все просто и понятно.

Зачем сейчас нужны точки соединения? После появления в NT 6.0 настоящих символических ссылок не нужны, но вы можете встретиться с ними как в устаревших системах, так и в современных, где они могут присутствовать в виде наследия. Поэтому знать о них и уметь с ними работать современному администратору надо.

Символические ссылки (SymbolicLink)

Пожалуй, самый популярный вид связи, позволяет создавать множество псевдонимов для файлов или каталогов размещая их на любых поддерживаемых локальных файловых системах. В качестве цели могут быть использованы как локальные, так и сетевые объекты. При создании символической ссылки можно использовать как абсолютные, так и относительные пути. Но в последнем случае вы не можете перемещать ссылку – она перестанет работать. Символические ссылки поддерживаются начиная с NT 6.0 (Vista и Server 2008) и работают с файловыми системами NTFS и ReFS.

Для создания символических ссылок можно использовать mklink
, без параметров она создает симлинк для файла:

   mklink  C:\Folder1\LinkFileName C:\Folder\FileName  
  

При создании ссылки не забываем указать расширения для файла. Как и в случае с точкой соединения символическая ссылка отображается в виде ярлыка и обозначается в выводе команды dir
:

windows-hardlink-and-symlink-005.png

Для создания символической ссылки на директорию добавьте ключ /D
:

   mklink /D D:\LinkFolder C:\Folder  
  

В PowerShell
все проще, тип объекта будет определен автоматически:

   New-Item -ItemType SymbolicLink -Path C:\Folder1\LinkFileName -Target C:\Folder\FileName  
  

Если в качестве цели указан файл – будет создана ссылка на файл, каталог – ссылка на каталог.

При переименовании, перемещении или удалении исходного файла или каталога все символические ссылки работать перестанут:

windows-hardlink-and-symlink-006.png

При копировании символической ссылки за пределы локального тома будет скопирован исходный файл, даже если целевой том поддерживает работу со ссылками, но это не мешает создать новую ссылку на другом томе.


Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik
. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.

:/>  Batch-script

Время на прочтение

Причиной написания была эта статья Ссылки в Windows, символические и не только
. Ее и можно почитать для ознакомление с тем, что такое жёсткие и символические ссылки в ntfs.

Я же продолжу и поделюсь некоторыми фактами о не очевидном поведении этих ссылок.


Сразу сделаю замечание. Если с жёсткими ссылками (Hard Links) неоднозначность вроде не наблюдается, то с мягкими или символическими ссылками есть путаница. Так вот я далее буду говорить о тех символических ссылках которые делаются программой Junction
( а также Alax. Info NTFS Links, Link Shell Extension и т.п.)

Подопытными программами были: Total Commander, Far, Frigate3, Servant Salamander, WinDirStat и Explorer в Windows XP.

Рекурсия.

Впервые с проблемами ссылок я столкнулся несколько лет назад, когда пытался написать «супер-пупер» утилиту по поиску и удалению дубликатов. Оказалось, что представляемые ОС механизмы поиска и обхода каталогов впадают в рекурсию при обработке каталогов в которых есть символическая ссылка на себя или родительский каталог. Конечно это можно избежать, если распознавать ссылки и обрабатывать их особым образом, отдельно от каталогов. Но дипломный проект прервал разработку утилиты, а потом я решил не тратить время на создание очередного «чистильщика дубликатов». Сейчас думаю, что зря.

Дело в том, что большинство программ, работающие с файлами не знают про символьные ссылки. И вот к чему это приводит.

Поиск.

Создадим каталог

X:\000

В нем создадим файл text.txt и символическую ссылку 111 на этот же каталог X:\000

Вот что выдадут при поиске файла наши подопытные файл-менеджеры кроме Far-а

X:\000\text.txt

X:\000\111\text.txt

X:\000\111\111\text.txt

X:\000\111\111\111\text.txt

X:\000\111\111\111\111\text.txt

X:\000\111\111\111\111\111\text.txt

X:\000\111\111\111\111\111\111\text.txt

X:\000\111\111\111\111\111\111\111\text.txt

X:\000\111\111\111\111\111\111\111\111\text.txt

X:\000\111\111\111\111\111\111\111\111\111\text.txt

X:\000\111\111\111\111\111\111\111\111\111\111\text.txt

X:\000\111\111\111\111\111\111\111\111\111\111\111\text.txt

X:\000\111\111\111\111\111\111\111\111\111\111\111\111\text.txt

X:\000\111\111\111\111\111\111\111\111\111\111\111\111\111\text.txt

X:\000\111\111\111\111\111\111\111\111\111\111\111\111\111\111\text.txt

X:\000\111\111\111\111\111\111\111\111\111\111\111\111\111\111\111\text.txt

Радует что рекурсия прервалась так рано. Но все равно такое поведение неправильно и может привести к ошибкам. Тут мы нашли один и тот же файл 16 раз. Многие программы для поиска дубликатов предложат удалить этот файл, как дубликат. Хотя на самом деле файл вполне уникален.

А вот Far, оказывается, при поиске вообще не переходит по символическим ссылкам.

Размер каталога

Такое поведение приводит к интересным эффектам при определении размера каталога. Можно сделать так, что этот размер окажется во много раз больше размера диска. Например на моем ноутбуке есть папка размером 300 Тб. Такой же фокус с размерами можно сделать используя жёсткие ссылки.

image

Среди подопытных программ правильно определили размер только WinDirStat и Explorer.

С эксплорером все понятно — он и реализация символических ссылок в windows детище одной и той же фирмы и было бы странно если они неправильно использовали свой же механизм ссылок. А вот WinDirStat так хорошо знаком со ссылками, наверное потому, что родом из Linux.

Копирование символических ссылок

При копировании ссылок подопытные файл-менеджеры вели себя по разному.

*
Far — копировал символические ссылки как ссылки. Т.е. делал копию ссылки и не ее содержимого.

*
Explorer на каждую ссылку задавал вопрос — копировать ее как каталог или как ссылку. Но я подозреваю что такое умное поведение ему придала установленная утилита Alax. Info NTFS Links. Проверить как ведет себя Explorer на windows xp без всяких расширений я не смог, а на windows 2000 explorer ведет при копировании себя как far.

*
Все остальные подопытные копировали ссылки как каталоги.

При копировании ссылок нужно понимать, что это такое. Если ссылки копировать как файлы, то я например не смогу скопировать свою папочку «ИНТЕРНЕТ» в ближайшее время. Если же копировать ссылки как ссылки, то может оказаться, что скопированный на другой hdd в фаре каталог с фильмами у друга не откроется, так как внутри были символьные ссылки. А то куда они ссылались осталось на другом hdd. В общем при копировании наиболее правильно ведет себя Explorer в установленным правильным расширением.

Тут я решил проверить, а поддерживают ли архиваторы символические ссылки. Оказалось что нет. Все архиваторы из моей коллекции (в том числе 7Z, winrar ) не сохраняют символические ссылки. К сожалению в моей коллекции не оказалось портированных архиваторов вроде tar-а. Надеюсь, что программы из линукса опять помогут.

Что касается жёстких ссылок на файл, то все программы копируют, архивируют их как файлы, не распознавая ссылка это или нет. В принципе, это ожидаемо.

Удаление символических ссылок.

При удалении символических ссылок отличились Frigate3 и Servant Salamander. Они не только удалили ссылку, но и заботливо очистили содержимое каталога на который она ссылалась. Остальные подопытные удалили только ссылку.

Параноикам.

Удаление жестких ссылок не несет проблем. Правда, мне не понятно, почему я не могу удалить одну жесткую ссылку на файл, если он открыт по другой жесткой ссылке.

Нужно помнить, что жесткие ссылки по сути разные имена одного и того же файла.

При использовании программ которые безвозвратно затирают файл (например Sdelete
) безвозвратное удаление одной жесткой ссылки приведет к тому, что остальные жестки ссылки на файл будут ссылаться на кучу мусора. В данном случае такое поведение логично и правильно. Если уж затирать файлы, то насовсем.

Выводы.

Наверное потому, что символические ссылки не были популярны в Windows многие программисты про них забывают. А может ссылки потому и не популярны, что программисты про них забывают и их программы работают с ссылками как получится. В общем будьте внимательны при использовании символических и жестких ссылок и проверяйте как ваш файл-менеджер с ними обращается.

ЗЫ. Оказывается не хватает кармы, что бы писать в тематический блог. Ну да ладно. Может и тут кому полезно будет.

UPD: Эксперименты проводились в Microsoft Windows XP Home Edition 32bit SP3

Total Commander 7.04a

Far 1.70

Servant Salamander 2.0

WinDirStat 1.1.2.80 (Unicode)

Frigate 3.21.2.71

Explorer 6.00.2900.5512

Учел замечание Busla
и поменял перевод Symbolic link на более распространенный вариант.

UPD2:

Дабы еще раз уточнить о чем речь и убрать разногласия в терминологии посеянные с легкой руки MS.

Полистав msdn я так понял, что в конце концов в MS пришли к единому мнению. Вроде как. И в Windows Vista сделали некие symbolic link которые создаются функцией CreateSymbolicLink
.

А те символьные == символические == мягкие ссылки которые были (и есть) в ранних версиях Windows (2000,XP) являются некими reparse point. И создаются примерно так:

memset(reparseInfo, 0, sizeof(*reparseInfo));

reparseInfo->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;

reparseInfo->ReparseTargetLength =

_tcslen(targetNativeFileName) * sizeof(WCHAR);

reparseInfo->ReparseTargetMaximumLength =

reparseInfo->ReparseTargetLength + sizeof(WCHAR);

_tcscpy(reparseInfo->ReparseTarget, targetNativeFileName);

reparseInfo->ReparseDataLength = reparseInfo->ReparseTargetLength + 12;

DeviceIoControl(

hFile,

FSCTL_SET_REPARSE_POINT,

reparseInfo,

reparseInfo->ReparseDataLength + REPARSE_MOUNTPOINT_HEADER_SIZE,

NULL,

0,

&returnedLength,

NULL);

Так вот, поскольку у меня не виста, речь идет о reparse point. Хотя я предполагаю, что и symbolic link тоже преподнесут сюрприз неоднозначным поведением в разных программах. Ибо проблема в основном не в ссылках, а в том что некоторые программисты про них забывают.

Оставьте комментарий