Войти

Показать полную графическую версию : Как найти и удалить символьную ссылку


TERMINAL
12-06-2013, 12:42
Здравствуйте, используется система Windows 7 и мне нужно найти символьные ссылки и удалить их для создания новых путей. Возможно ли это в AutoIt ?

Iska
12-06-2013, 12:58
Возможно ли это в AutoIt ? »
Это возможно и без AutoIt: Junction (http://technet.microsoft.com/ru-ru/sysinternals/bb896768).

TERMINAL
12-06-2013, 13:13
Iska, В AutoIt при копировании папки можно определить-существуют ли в ней символьные ссылки, если ДА, то не копировать. У меня проблема-копирую папку средствами AutoIt и в итоге копируются не символьные ссылки (которые потом изменять нужно на новый путь), а целые папки.

Iska
12-06-2013, 13:34
В AutoIt при копировании папки можно определить-существуют ли в ней символьные ссылки, »
Не вижу такого: Function DirCopy (http://www.autoitscript.com/autoit3/docs/functions/DirCopy.htm). О какой функции копирования папки идёт речь?

TERMINAL
12-06-2013, 14:15
Хочу перенести папку с С:\Users\test\Documents в D:\Users\test\Documents, и в С:\Users\test\Documents находятся маркерные ссылки, Мои видеозаписи, Мои рисунки, Моя музыка, которые после копирования превращаются в папки.

Iska
12-06-2013, 14:44
А, так фразу «при копировании папки можно определить» следует понимать как «хотелось бы иметь возможность при копировании папки».

Symbolic Link Effects on File Systems Functions (Windows) (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365682(v=vs.85).aspx)

TERMINAL, возьмите какой-нибудь OpenSource'ный проект, где имеется реализация функций копирования с поддержкой точек повторного подключения (например, файловый менеджер Far Manager (Far Manager Official Site : исходный*код (http://www.farmanager.com/opensource.php?l=ru))) и посмотрите, как сие там реализовано.

╔════════════════════════════════════════════════════════════════════ Помощь - FAR ════════
║ Копирование: правила
╟──────────────────────────────────────────────────────────────────────────────────────────
║ При копировании/перемещении папок и символических ссылок соблюдаются следующие правила.

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

║ Если включена опция "Копировать содержимое символических ссылок"
║ или источник или приёмник - сетевые диски, то в приёмнике
║ создаётся папка и в неё копируется содержимое ссылки-источника
║ (для вложенных ссылок рекурсивно).

║ Если опция "Копировать содержимое символических ссылок" выключена,
║ и источник и приёмник - локальные диски, то в приёмнике создаётся
║ связь или символическая ссылка, в зависимости от типа источника.

║ Перемещение символической ссылки

║ Если включена опция "Копировать содержимое символических ссылок"
║ или источник или приёмник - сетевые диски, то в приёмнике
║ создаётся папка и в неё копируется содержимое ссылки-источника
║ (для вложенных ссылок рекурсивно). Сама ссылка в источнике
║ удаляется.

║ Если опция "Копировать содержимое символических ссылок" выключена,
║ и источник и приёмник - локальные диски, то ссылка-источник просто
║ переносится. Рекурсивный спуск по дереву не производится.

║ Перемещение каталога, содержащего символические ссылки

║ Если источник и приёмник - локальные диски, то каталог просто
║ перемещается.

║ Если источник или приёмник - сетевые диски, то независимо от
║ состояния опции "Копировать содержимое символических ссылок"
║ в приёмнике создаётся папка и в неё копируется содержимое
║ ссылки-источника (для вложенных ссылок рекурсивно).
║ Сама ссылка в источнике удаляется.

TERMINAL
12-06-2013, 15:33
Iska, Так мне Фар и другие программы не нужны, хочу сделать это программно на AutoIt !

Iska
12-06-2013, 17:58
TERMINAL, я и говорю — смотрите код того же Far Manager'a на С — как там реализовано копирование символических ссылок — и переводите его на AutoIt. Какие-то функции WinAPI уже есть в WinAPI.au3 и WinAPIEx.au3.

TERMINAL
13-06-2013, 09:53
смотрите код того же Far Manager'a на С »
Низнаю как код Far`а просмотреть, одни dll-ки.

Iska
13-06-2013, 10:19
Far Manager Official Site : исходный*код (http://www.farmanager.com/opensource.php?l=ru) → Исходный код Far Manager (http://farmanager.com/svn/trunk/unicode_far) → copy.cpp (http://farmanager.com/svn/trunk/unicode_far/copy.cpp) + flink.cpp (http://farmanager.com/svn/trunk/unicode_far/flink.cpp).

Можете разобраться и сами, прочитав: Reparse Points and File Operations (Windows) (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365505(v=vs.85).aspx) и Symbolic Link Effects on File Systems Functions (Windows) (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365682(v=vs.85).aspx), создать точки повторной обработки разного типа и поиграться с ними, вызывая из AutoIt WinAPI функции копирования с разными флагами, пока не добьётесь нужного поведения.

Мне, правда, непонятно, почему Вы не хотите просто воспользоваться mklink/Junction для изложенных выше:
Хочу перенести папку с С:\Users\test\Documents в D:\Users\test\Documents, и в С:\Users\test\Documents находятся маркерные ссылки, Мои видеозаписи, Мои рисунки, Моя музыка, которые после копирования превращаются в папки. »
целей.

TERMINAL
13-06-2013, 11:31
Мне, правда, непонятно, почему Вы не хотите просто воспользоваться mklink/Junction для изложенных выше: »
Я бы с удовольствием, это бы упростило бы работу, но как я писал раньше-копируются папки на которых ссылка-поэтому приходится после полного копирования их потом удалять и с помощью mklink делать ссылки-тогда всё чудесно. Проблема в том что при копировании (DirCopy) AutoIt не понимает этих ссылок и принимает их за папки.

Iska
13-06-2013, 13:26
А не надо делать «полное копирование».

TERMINAL
13-06-2013, 13:42
А не надо делать «полное копирование» »
А как тогда ? По папкам тот же результат будет...

Iska
13-06-2013, 15:57
Рассматриваете каждый объект файловой системы на предмет того, является ли он точкой повторной обработки и соответственно полученному поступаете. Я же не знаю, что Вы подразумеваете под «переносом «Users» на «D:\»». Вот, например:
╔═════════════════════════════════════ C:\Users ════════════════╤══════╤════════╤═════╗
║n Name │ Size │ Date │Time ║
║.. │ Up │03.03.11│01:43║
║All Users │Symlin│14.07.09│09:06║
║Default 1│18:50║
║Default ╔═════════════════════════ Attributes ═════════════════════════╗ 9│09:06║
║Public ║ Change file attributes for ║ 9│08:57║
║Админист ║ All Users ║ 1│18:52║
║Админист ║ Symlink: C:\ProgramData ║ 3│18:13║
║Все поль ╟──────────────────────────────────────────────────────────────╢ 1│18:50║
Вы «C:\ProgramData» будете переносить на «D:\»? Или оставите на месте? Если оставляете — этот объект файловой системы нужно копировать как именно как точку повторной обработки (или банально создать такую же по новому месту). Если будете переносить — копировать смысла не имеет, поскольку симлинк «D:\All Users» должен будет уже ссылаться на «D:\ProgramData». И т.п.

Далее, например, есть у нас:
╔═════════════════════════════════════ C:\Users ════════════════╤══════╤════════╤═════╗
║n Name │ Size │ Date │Time ║
║.. │ Up │03.03.11│01:43║
║All Users │Symlin│14.07.09│09:06║
║Default │Folder│13.01.11│18:50║
║Default User │Juncti│14.07.09│09:06║
║ │14.07.09│08:57║
║ ╔═════════════════════════ Attributes ═════════════════════════╗ │13.01.11│18:52║
║ ║ Change file attributes for ║ │05.02.13│18:13║
║ ║ Default User ║ │13.01.11│18:50║
║ ║ Junction: C:\Users\Default ║ │21.05.13│17:04║
║ ╟──────────────────────────────────────────────────────────────╢ │14.07.09│08:57║
Что с этим делать? Если не копировать эту точку повторной обработки именно как точку повторной обработки — будет создана простая папка «Default User» в «D:\Users». Если копировать как точку повторной обработки — будет «D:\Users\Default User», ссылающаяся на «С:\Users\Default». И толку-то? Нам-то надо получить ссылку на «D:\Users\Default». Понимаете?




© OSzone.net 2001-2012