Как систематизировать файлопомойку

Когда я скачиваю какой-то файл из Интернета, я редко сразу определяю, куда его класть. Обычно он скачивается в некий каталог, специально предназначенный для всего, что скачано из Интернета - так называемая "файлопомойка". Разгребание файлопомойки - процесс при таком подходе неизбежный, но, на мой взгляд, это меньшее из зол, если сравнивать его с необходимостью сразу определить файл в конкретную папочку. Во-первых, это отвлекает от основной мысли :) Во-вторых, я наверняка через полчаса забуду, куда его положил. А в-третьих, все равно впоследствии обычно возникает желание пересмотреть систематизированные файлы и категории: что-то объединить, что-то разделить, какие-то файлы переместить и так далее. А раз этот процесс все равно неизбежен, зачем торопить события? Пусть пока отлежится в файлопомойке, потом определим, куда его деть.

Все бы хорошо, но "потом" обычно наступает сильно потом :) В итоге я уже и не вспомню, что за файлик hlm.zip и откуда он взялся - такие "безымянные" файлики, как правило, лежат мертвым грузом в файлопомойке. Впрочем, все современные браузеры (не считая, разумеется, IE), не говоря уже о специализированных менеджерах закачек, хранят информацию обо всех скачанных файлах: когда, откуда был скачан, иногда даже сохраняется информация о странице, с которой была получена ссылка на закачку.

Так что, казалось бы, в чем проблема? Более того, многие менеджеры закачек позволяют создавать дерево меткок и присваивать закачкам произвольное количество меток из этого дерева - это дает довольно мощное средство систематизации файлов, не вставая с места... но есть пара "но". Во-первых, чтобы найти файлик, мне придется лезть в менеджер закачек, а это не всегда удобно. Во-вторых, стоит мне переместить файл в другое место, как менеджер закачек этот файл безвозвратно теряет. В-третьих, систематизировать таким образом можно только те файлы, которые были скачаны именно данным менеджером. А если я пользуюсь четырьмя браузерами, и не все дружат с менеджером закачек? А еще некоторые файлы мне на флешке приносят или по скайпу передают? А еще некоторые вещи я скачиваю через торренты или DC++?..

Кстати о торрентах и DC++. Клиенты файлообменных систем еще более требовательны к местоположению файла: они же должны знать, откуда вести раздачу. Более того, если конкретный файл раздается в данный момент, то клиент просто не даст его переместить. И именно попытка систематизировать скачанное из торрентов натолкнула меня на мысль, которая, кажется, решает все означенные выше проблемы.

Есть такая штука, как жесткие ссылки (hard links). Про них мало кто знает, и еще меньше народу пользуется (линуксоиды, молчать!) - и все потому, что Microsoft не потрудилась предоставить штатных средств для управления ими. А между тем технология очень удобная, логичная и простая до безобразия.

Если объяснять на пальцах, то это попросту возможность присвоить одному файлу несколько имен. В отличие от всем известных "ярлыков", эти имена абсолютно равноправны, и поэтому любое из них можно спокойно переименовывать, перетаскивать в другое место и даже удалять - до тех пор, пока у файла осталось хотя бы одно имя, с файлом ничего не случится. Только удаление последнего имени вызывает собственно удаление файла.

Я про эту технологию знал давно, еще со времен освоения линукса, но пользовался редко - как-то не было необходимости. В линуксе существует штатное средство управления жесткими ссылками; под винду, впрочем, тоже написано немеряно приблуд - только выбирай. Когда-то давно я пользовался программой Антона Попова Hard Link Magic (его домашняя страничка давно мертва, поэтому, полагаю, Антон не обидится, если я размещу дистрибутив на своем сайте), для работы в консоли недавно раздобыл программу filelink.

Так вот, с использованием жестких ссылок задача систематизации файлопомойки значительно упрощается. Покажу на примере торрентов. Итак, дано:
1. Один большой жесткий диск (около терабайта), отформатированный под NTFS.
2. Там есть каталог, скажем, D:\Torrents, куда сваливается все, что скачивается через торрент-клиент.

И вот, если у меня на этом же диске есть какой-нибудь каталог типа D:\Video\Фильмы\Мелодрамы, и я хочу положить туда скачанный мною фильм "Знакомьтесь, Джо Блэк.avi" - никаких проблем. Создаю жесткую ссылку - и теперь этот файл есть и в каталоге D:\Torrents, и в каталоге D:\Video\Фильмы\Мелодрамы. А также, если захочу, еще и в D:\Video\Фильмы\Мистика, и в D:\Video\Фильмы\Брэд Питт, и еще где угодно. А для торрент-клиента он по-прежнему лежит в D:\Torrents, и он может спокойно раздавать этот фильм, не заботясь о моих изысках с систематизацией. Причем физически это один и тот же файл, соответственно, места продолжает занимать столько же, сколько и до всей этой операции.

Многие торрент-раздачи состоят из каталогов - соответственно, жесткую ссылку нужно делать на каждый файл в каталоге. Ни для hlm, ни для filelink это не является проблемой:
D:\Torrents> filelink -s "D:\Видео\Сериалы\Fawlty Towers - Season 1 + 2" "Fawlty Towers - Season 1 + 2"
или
пакетное создание жестких ссылок

Естественно, у данного подхода есть и свои ограничения. Жесткие ссылки действуют только в пределах одного логического диска - при переносе файла на другой логический раздел ссылка рвется. Поэтому в "дано" и написано "один большой жесткий диск" :) Но шутки шутками, а это еще один аргумент в пользу расставания с атавистической привычкой разбивать жесткий диск на несколько маленьких. Вот что составляет серьезную проблему - это апгрейд и переезд на новый винчестер: при обычном копировании на новый раздел все жесткие ссылки станут обычными копиями файлов и начнут занимать соотвествующий объем на диске. Единственное рабочее решение, которое мне удалось придумать - это создание полного бэкапа раздела через какой-нибудь NT Backup или Acronis и последующее развертывание его на новом месте. Есть еще программка Same File Assistant, которая вроде как позволяет найти копии файлов и сделать вместо копий жесткие ссылки - но я ее не пробовал.

Есть еще один интересный момент. Разумеется, как и положено тестировщику, я подумал: в один прекрасный день настанет такой момент, когда суммарный объем файлов на диске превысит объем самого диска. Интересно, что скажет винда, когда я спрошу ее, сколько на диске свободного места?

Размер моего системного диска C: - 20 с небольшим гигабайт, больше половины из которых занято операционной системой и различными документами.
Я скопировал туда полуторагигабайтный фильм и создал десяток жестких ссылок этого же файла, после чего полез в "свойства", надеясь увидеть перекореженную диаграмму. Однако винда оказалась умнее, чем я предполагал:

каталог с жесткими ссылками диаграмма свободного места на диске при наличии жестких ссылок

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

Впрочем, когда я удалил все тестовые файлы, на диске так и осталось 31.9 гигабайт. Очистка корзины не помогла, перезагрузка системы - тоже. Написать, что ли, багрепорт в Microsoft? :)