Страница 1 из 1

Копирование с сохранением структуры жёстких ссылок

Добавлено: Сб июл 07, 2012 13:19
LonerD
Цель - копирование файлов с сохранением жёстких ссылок.

Проще объяснить на примере.
На диске D имеются три файла (на самом деле файлов и каталогов/подкаталогов гораздо больше, но для примера достаточно минимум).
d:\file1.ext
d:\file2.ext
d:\file3.ext

d:\file1.ext и d:\file2.ext являются жёсткими ссылками друг на друга (то есть физически это один файл).
d:\file3.ext побайтово совпадает с d:\file1.ext, но физически - это два разных независимых файла.

Цель - переместить все эти файлы на диск E:, получив ту же структуру.
То есть в итоге:
e:\file1.ext и e:\file2.ext - жёсткие ссылки друг на друга
e:\file3.ext - просто отдельный файл.

Существует несколько утилит, которые заменяют в целевом каталоге все одинаковые файлы на жёсткие ссылки. Но они заменяют ВСЕ файлы, а нужно на целевом диске сделать жёсткими ссылками только те файлы, которые являлись таковыми на исходном диске.

Добавлено: Сб июл 07, 2012 14:04
MVV
Ни разу таких не видел. Это надо составить список файлов в исходной папке и их индексов, а потом в папке назначения заменить жесткими ссылками файлы, индексы которых в исходной папке встречаются более 1 раза.

Добавлено: Сб июл 07, 2012 14:14
Flasher
Способ-то понятен, сейчас надо понять как читать индекс.
MVV писал(а):Ни разу таких не видел.
:lol:

Добавлено: Сб июл 07, 2012 14:41
MVV
Flasher писал(а):Способ-то понятен, сейчас надо понять как читать индекс.
Через API читается элементарно.
Flasher писал(а):
MVV писал(а):Ни разу таких не видел.
:lol:
В моем посте было без ссылки. И потом, прочти первый пост, автор ищет не программы, которые заменяют копии файлов жесткими ссылками, а программы, дублирующие структуру папок с сохранением жестких копий в её пределах. Вот таких я не видел.

Добавлено: Сб июл 07, 2012 14:55
Flasher
Автор написал
LonerD писал(а):Существует несколько утилит, которые...
Он не писал, что ищет программы. Программы у нас вот здесь обсуждаются, так на всякий случай.
MVV писал(а):Через API читается элементарно.
Предлагаешь подключать DynamicWrapperX?

Добавлено: Сб июл 07, 2012 16:04
LonerD
Он не писал, что ищет программы.
Без разницы - будет ли это родной функционал какой-либо программы (если таковая вдруг существует) или скрипт.
Скрипт может быть как минимум двух вариантов:
1. Копирует/перемещает файлы и в процессе копирования/перемещения отслеживает наличие жёстких ссылок, сразу же их создавая на целевом диске.
2. Вначале просто копируются все файлы с одного диска на другой, а потом скрипт анализирует исходный и целевой диски(каталоги на дисках) и переносит структуру жёстких ссылок, заменяя в целевом соответствующие файлы на жёсткие ссылки.

Добавлено: Сб июл 07, 2012 18:09
MVV
Самый быстрый и корректный вариант - копировать файл за файлом, получая их индексы с помощью функции GetFileInformationByHandle и добавляя пары "оригинальный индекс-целевой путь" в упорядоченный по индексам массив, поддерживая упорядоченность. При переходе к очередному файлу проверять его индекс на присутствие в массиве бинарным поиском и, если индекс найден, вместо копирования файла создавать жесткую копию для файла, путь к которому соответствует индексу из пары. Но как это сделать с помощью скрипта, понятия не имею, возможно справится упомянутый DynamicWrapperX.

Добавлено: Сб июл 07, 2012 19:42
LonerD
Всем спасибо. Запрошенный функционал найден в Link Shell Extension (опция Smart Copy). На первый взгляд - самое оно.