В чем разница между символической ссылкой и ярлыком?
5 ответов
Я думаю, что важным моментом является то, что ярлыки - это просто файл. У них есть размер (маленький, который просто указывает, куда они указывают), и они требуют, чтобы приложение поддерживало этот тип файла для использования.
Символическая ссылка - это уровень файловой системы, и все видят ее как исходный файл. Приложение не нуждается в специальной поддержке для использования символической ссылки.
"Символическая ссылка" может фактически действовать как замена каталога или файла функциональным способом и обычно используется в средах Unix/Linux. Хотя в Windows это явно поддерживается, я пока не видел его реального использования.
"Ярлык" - это обычный файл, в котором есть ссылка на файл или каталог назначения, а также некоторые другие вещи, например, отображаемый значок. В отличие от символической ссылки, вы не можете «cd ./shortcut-name» в DOS (в Unix/Linux вы можете «cd ./symlink-name», и она будет работать так же, как настоящий подкаталог).
Кроме того, в большинстве приложений Windows, когда вы нажимаете на ярлык в любом диалоге File-> Open GUI, поле вашего имени файла заполняется именем этого ярлыка, а также действует как подкаталог, в то время как в Unix/Linux GUI обрабатывает Символьная ссылка как путь (без изменения поля имени файла).
Как уже упоминалось, символическая ссылка является одним из видов ссылок, доступных на уровне файловой системы, что делает ее прозрачной для приложений. Я нашел эту документацию очень полезной (особенно в разделе «Обрезать / развернуть / соединить внешние соединения / символические ссылки»). И инструмент там тоже выглядит красиво. (Упомянув это и mklink, мы надеемся, что дальнейшие поиски найдут это обсуждение.)
Ярлык - это файл, а не реальная ссылка, и, как правило, он успешно используется в качестве ссылки только при интерпретации пользовательским интерфейсом Windows. Например, если дважды щелкнуть ярлык папки, Windows перенаправит вас в другое место. (Это включает в себя общие диалоговые окна открытия файла и сохранения файла, которые вызываются большинством приложений.) На рабочем столе у меня есть ярлык для этой папки: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\G
Имя ярлыка: C:\Users\user5\Desktop\Games.lnk, хотя Windows подавляет расширение .lnk и отображает только "Игры", даже если вы снимите флажок "скрывать расширения для известных типов файлов". Но если вы откроете командную строку и выполните команду dir, вы увидите это:
C:\Users\user5\Desktop>dir "g*"
Volume in drive C has no label.
Volume Serial Number is 900...
Directory of C:\Users\user5\Desktop
03/08/2014 05:30 PM 1,710 Games.lnk
1 File(s) 1,710 bytes
0 Dir(s) 246,818,222,080 bytes free
Я могу создать эквивалент с символической ссылкой, используя опцию \D (для каталога):
C:\Users\user5\Desktop>mklink /D mysymlink "C:\ProgramData\Microsoft\Windows\S
tart Menu\Programs\G"
symbolic link created for mysymlink <<===>> C:\ProgramData\Microsoft\Windows\Sta
rt Menu\Programs\G
C:\Users\user5\Desktop>cd mysymlink
C:\Users\user5\Desktop\mysymlink>
(Соединение каталогов (\J) тоже вариант, так как это ссылка на папку.) Проводник Windows, так же как эта консоль и большинство приложений, позволит вам "заглянуть" в этот кажущийся подкаталог, вместо того, чтобы (а) перенаправлять "через" в другое место или (б) потерпеть неудачу.
Ярлыки не ведут себя как подкаталоги. Я могу вызвать поведение файла интерфейса пользователя по умолчанию в Windows с помощью этой команды (в Windows Explorer открывается папка "G"):
C:\Users\user5\Desktop>"Games.lnk"
Принимая во внимание, что mysymlink перечислен (см. Количество) как истинный подкаталог и не может быть запущен таким образом:
C:\Users\user5\Desktop>dir "my*"
Volume in drive C has no label.
Volume Serial Number is 900...
Directory of C:\Users\user5\Desktop
03/29/2014 06:08 PM <DIR> mysubdir
03/29/2014 05:40 PM <SYMLINKD> mysymlink [C:\ProgramData\Microsoft\Windo
ws\Start Menu\Programs\G]
0 File(s) 0 bytes
2 Dir(s) 246,816,153,600 bytes free
C:\Users\user57\Desktop>mysubdir
'mysubdir' is not recognized as an internal or external command,
operable program or batch file.
C:\Users\user57\Desktop>mysymlink
'mysymlink' is not recognized as an internal or external command,
operable program or batch file.
И наоборот, вы не можете изменить каталог на ярлык:
C:\Users\user5\Desktop>cd "Games.lnk"
The directory name is invalid.
Пользовательский интерфейс Windows позволяет щелкнуть правой кнопкой мыши, чтобы изменить свойства ярлыка. Или ниже показано, что именно хранится в файле .lnk (двоичные данные), хотя лучше будет отображать шестнадцатеричный редактор:
C:\Users\user5\Desktop>notepad.exe "Games.lnk"
В то время как при попытке запустить Блокнот в реальной подпапке появляется сообщение об ошибке "Отказано в доступе" и пустой Блокнот.
И наоборот, если я создаю символическую ссылку на файл (не символическую ссылку на папку), я могу запустить ее с помощью Блокнота. Из следующих вызовов notepad.exe первые два работают, а третий завершается неудачно (открывается.LNK-файл, двоичный файл gobbledegook).
C:\Users\user5\Desktop>mklink symplain.txt plain.txt
symbolic link created for symplain.txt <<===>> plain.txt
C:\Users\user5\Desktop>notepad.exe "symplain.txt"
C:\Users\user5\Desktop>notepad.exe "plain.txt"
C:\Users\user5\Desktop>notepad.exe "plain.txt.lnk"
Это не просто консоль. Копирование ярлыка в Блокнот на мой рабочий стол и попытка перетаскивания на него каждого из трех элементов демонстрирует точно такое же поведение. (Поскольку перетаскивание, в отличие от двойного щелчка, позволяет приложению интерпретировать ярлык.)
Относительно различий между символьными ссылками каталога и соединениями, посмотрите это обсуждение, и вот очень полезное описание:
«Основное различие в том, как Windows разрешает символические ссылки и соединения каталогов, заключается в том, где происходит обработка. Windows обрабатывает символические ссылки в локальной системе, даже если они ссылаются на местоположение на удаленном файловом сервере. Windows обрабатывает соединения каталогов, которые ссылаются на удаленный файловый сервер на самом сервере. Таким образом, символические ссылки на сервере могут ссылаться на местоположения, которые доступны только от клиента, как и другие тома клиента, тогда как соединения каталогов не могут. Для решения этой проблемы Windows Vista поддерживает новый тип символических ссылок как для файлов, так и для каталогов.
«Многие команды файловой системы были обновлены, чтобы понять значение символических ссылок. Например, команда «Удалить» знает, что не следует переходить по ссылкам, что приведет к удалению цели, а вместо этого удалить ссылку. Однако, поскольку не все приложения могут правильно обрабатывать символические ссылки, для создания символической ссылки требуется новая привилегия «Создать символическую ссылку», которую по умолчанию имеют только администраторы ».
«Символические ссылки отличаются от ярлыков тем, что они предлагают прозрачный * путь к нужному объекту данных, с ярлыком (.lnk), что-то должно считывать и интерпретировать содержимое файла ярлыка, а затем открывать файл, на который он ссылается (т.е. это двухэтапный процесс). Когда приложение использует символическую ссылку, оно получает немедленный доступ к объекту данных, на который ссылается символическая ссылка (т. Е. Это одношаговый процесс). "
Источник: http://schinagl.priv.at/nt/hardlinkshellext/linkshellextension.html
Иногда полезно иметь функциональный пример, поэтому плохо объясню, как я использую эту функцию.
Я использую Google Drive для резервного копирования файлов, но иногда я хочу создавать резервные копии файлов в определенной папке (я не могу переместить их на ../google диск). Особенно с универсальными приложениями Windows 10, файлы конфигурации и тому подобное хранятся в appdata, и большую часть времени я не могу изменить это местоположение.
Я использую родное приложение Windows stikynot, и я хотел сделать резервную копию своих заметок, поэтому я использовал символическую ссылку здесь. Диск Google распознает ссылку как фактический файл и синхронизирует файлы очень хорошо, в то время как фактический файл все еще находится в папке appdata.
Когда у меня есть локальные файлы, например папки проекта, которые я не хочу синхронизировать с облаком, я использую ярлыки (копировать, вставить-> вставить ярлык).