пятница, 4 мая 2012 г.

Жёсткие ссылки, символьные ссылки и точки соединения в Windows Vista/7

Хочу поведать маленькую историю. Одна программа писала свои данные в "file1.txt", а вторая программа читала данные из этого файла. Но после обновления вторая программа стала требовать данные из файла с другим именем - "file2.txt". Конечно, можно было бы копировать содержимое из "file1.txt" в "file2.txt", но, во-первых, это было бы неудобно, а во-вторых, нельзя одновременно работать с этим содержимым обеим программам. Решение кроется в жёских ссылках.

Для начала стоит почитать, что пишут на Википедии в статье "Жёсткая ссылка". В Windows Vista/7 появилась новая команда mklink:
e:\test>mklink /?
Создание символической ссылки.

MKLINK [[/D] | [/H] | [/J]] Ссылка Назначение

        /D          Создание символической ссылки на каталог.
                    По умолчанию создается символическая ссылка на файл.
        /H          Создание жесткой связи вместо символической ссылки.
        /J          Создание соединения для каталога.
        Ссылка      Имя новой символической ссылки.
        Назначение  Путь (относительный или абсолютный), на который ссылается
                    новая ссылка.

e:\test>
которая, по-сути, позволяет создать новое имя файла:
e:\test>dir /b
file1.txt

e:\test>mklink /h mylinkfile.txt file1.txt
Создана жесткая связь mylinkfile.txt <<===>> file1.txt

e:\test>type mylinkfile.txt
Hello, world!

e:\test>echo Wow! It Works! > file1.txt

e:\test>type mylinkfile.txt
Wow! It Works!

e:\test>del mylinkfile.txt

e:\test>type file1.txt
Wow! It Works!

e:\test>

Но в пределах одного логического диска:
e:\test>mklink /h mylinkfile2.txt d:\treeinfo.wc
Системе не удается переместить файл на другой диск.

Для каталогов используется опция /j, с помощью которой можно создать точку соединения:
e:\test>mkdir dir1

e:\test>echo content of file > dir1/file1.txt

e:\test>mklink /j mylinkdir dir1
соединение создано для mylinkdir <<===>> dir1

e:\test>dir mylinkdir
 Том в устройстве E имеет метку Разное
 Серийный номер тома: 508D-73DF

 Содержимое папки e:\test\mylinkdir

05.05.2012  01:32    <DIR>          .
05.05.2012  01:32    <DIR>          ..
05.05.2012  01:32                18 file1.txt
               1 файлов             18 байт
               2 папок  17 713 184 768 байт свободно

e:\test>type mylinkdir\file1.txt
content of file

e:\test>rmdir mylinkdir

e:\test>type dir1\file1.txt
content of file

Напомним, что точка соединения может связывать каталоги на разных дисках:
e:\test>mklink /j mylinkdir c:\
соединение создано для mylinkdir <<===>> c:\

e:\test>dir /b mylinkdir
Documents and Settings
PerfLogs
Perl
Perl64
PHP
Program Files
Program Files (x86)
Users
Windows

Внимание! Ссылки можно создавать на локальных дисках. Нельзя создать ссылки на сетевом диске или на сетевой диск. Подтверждение. В противном случае получите ошибку:
z:\>mklink /j /d .ssh c:\Users\msuslov\.ssh
Local NTFS volumes are required to complete the operation.

С помощью mklink можно создавать символьные или "мягкие" ссылки. Символьные ссылки работают одинаково как для каталогов, так и для файлов:
E:\test>mklink mylinkdir dir1
символическая ссылка создана для mylinkdir <<===>> dir1

E:\test>mklink mylinkfile file1.txt
символическая ссылка создана для mylinkfile <<===>> file1.txt

Можно использовать параметр /D:
E:\test>mklink /d mylinkdirD dir1
символическая ссылка создана для mylinkdirD <<===>> dir1

E:\test>mklink /d mylinkfileD file1.txt
символическая ссылка создана для mylinkfileD <<===>> file1.txt
Но с ним и без него получаются разные ссылки:
04.05.2012  13:54    <DIR>          .
04.05.2012  13:54    <DIR>          ..
04.05.2012  13:52    <SYMLINK>      mylinkfile [file1.txt]
04.05.2012  13:52    <SYMLINKD>     mylinkfileD [file1.txt]
04.05.2012  13:53                 7 file1.txt
04.05.2012  13:54    <DIR>          dir1
04.05.2012  13:54    <SYMLINK>      mylinkdir [dir1]
04.05.2012  13:54    <SYMLINKD>     mylinkdirD [dir1]
               3 файлов              7 байт
               5 папок  44 225 687 552 байт свободно
С параметром /D создаются нерабочие ссылки, через которые доступ к содержимому каталогов и файлов получить мне не удалось. Зачем он нужен и что за тип ссылок с параметром /D остаётся открытым вопросом.

Следует учесть, что:
  1. Символьные ссылки требуют прав администратора.
  2. Это устаревший механизм связывания, использовавшийся в предыдущих версиях Windows.
  3. НО без него не обойтись, если файлы расположены на разных дисках, а ссылки нужны (для каталогов используем точки соединения).

Полезно почитать примеры применения: один и другой.

1 комментарий: