Теговая Файловая Система (Tagged File System, TFS)
Пример иерархической организации файлов в TFS
Проблемы TFS и пути их устранения
Непреднамеренные множественные модификации
В данной статье предлагается модель теговой (ассоциативной) файловой системы, построенной на широко известном и зарекомендовавшем себя принципе ассоциирования (присвоения) файлам атрибутов (тегов), содержащих дополнительную информацию о файлах. Отличительной особенностью представленной модели является возможность иерархической организации тегов, благодаря которой появляется возможность расширения классической модели иерархических файловых систем до модели, представляющей из себя ориентированный граф (см. Рис. 1).
* *
Рис. 1. Модели файловых систем: a) иерархическая; b) ассоциативная
Принципы TFS:
Поскольку теги являются файлами, им тоже можно присваивать теги. Файл может выступать в роли тега для самого себя.
X - файл с именем X
X [Y & Z] - файл с именем X, которому присвоены теги Y и Z
Если файл содержит пробелы и спецсимволы, его имя записывается в кавычках:
"X . X" ["Y^Y" & "Zzzz..."] - файл с именем "X . X", которому присвоены теги "Y^Y" и "Zzzz..."
A : B - файл A является наследником файла B. Таким образом, все теги от файла B переходят к файлу A.
Наиболее распространённая модель представления файлов в современных ФС - древовидная (иерархическая). Поскольку TFS является надмножеством иерархических ФС, задачу иерархического структурирования можно решить с помощью тегов.
Пусть, имеется следующая древовидная модель:
+-- Музыка
| |
| +-- Генератор зла
| |
| +-- Смотри!.mp3
| +-- Грязь.mp3
| +-- Дезертир.mp3
|
+-- Видео
|
+-- Генератор зла
|
+-- Смотри!.avi
Представим её в теговой модели:
Музыка
Видео
"Генератор зла" [Музыка]
"Генератор зла" [Видео]
"Смотри!.mp3" ["Генератор зла" [Музыка]]
"Смотри!.avi" ["Генератор зла" [Видео]]
Грязь.mp3 ["Генератор зла" [Музыка]]
Дезертир.mp3 ["Генератор зла" [Музыка]]
Как видим, корневые директории Музыка и Видео превратились в "корневые" теги; два файла "Генератор зла" имеют одинаковые имена, но различные теги, благодаря чему мы можем их различить. Если раньше полный путь к файлу Смотри!.mp3 мы записывали, начиная с корневой директории (/Музыка/Генератор зла/Смотри!.mp3), то в TFS запись идёт от имени искомого файла: "Смотри!.mp3" ["Генератор зла" [Музыка]]
Преимущества такого способа записи очевидны: если вы помните, как называется файл, но не помните директорию, в которой он находится, достаточно ввести его имя, и если оно уникально, нет необходимости вспоминать, какие теги были присвоены этому файлу. Например, файл Грязь.mp3 не нуждается в конкретизации по тегам, поскольку в ФС больше нет файлов с таким же именем.
Поиск файлов может производиться не только по имени, но и по тегам. Так, при поиске по тегу ["Генератор зла"], будут найдены как аудио-, так и видео-файлы, а при поиске по ["Генератор зла" [Видео]] результатом будет лишь файл Смотри!.avi
Данный пример, хотя и демонстрирует возможность иерархической организации файлов в TFS, имеет слабое отношение к действительности, поскольку не даёт никаких преимуществ перед существующими ФС. Давайте посмотрим, как можно улучшить организацию файлов, применяя теги.
Первое очевидное решение - введение предустановленных тегов [Video], [Audio], [Album], [Author] и т.п., назначаемых для медиа-файлов:
"Генератор зла" [Album]
Ария [Author]
"Смотри!" [Audio & Генератор зла]
"Смотри!" [Video & Генератор зла]
Грязь [Audio & Генератор зла]
Дезертир [Audio & Генератор зла]
Благодаря этому нововведению мы можем отказаться от расширения файлов, что делает имена более читаемыми. Кроме того, тот факт, что теги Audio и Video являются системными, даёт возможность средствам воспроизведения аудио- и видео-файлов отфильтровывать неподдерживаемые форматы.
set [Y] for X -- создаёт ассоциацию между файлами X и Y.
Y становится тегом для файла X.
Примеры:
set [Пасьянсы] for Паук [Игры] | присваивает тег [Пасьянсы] файлу Паук, имеющему тег [Игры]. Теперь файл "Паук" имеет полное имя Паук [Игры, Пасьянсы]. |
set [Фотки с корпоратива] for [Image(Created=2010-06-03) & Лёха [Author]] | присваивает тег [Фотки с корпоратива] всем фотографиям, созданным 3-го июня 2010 года неким Лёхой (вероятно, коллегой). |
reset [Y] for X [Z & Y] -- удаляет ассоциацию между файлами X [Y & Z] и Y. После этой операции полное имя файла X записывается в виде X [Z]
delete X [Y & Z]
В TFS операция копирования файлов заменена операцией клонирования. При клонировании файла создаётся его копия, имеющая такое же имя и теги. На рисунке ниже показан результат выполнения команды клонирования файла X, которое производится командой "clone X [Y & Z]":
clone X [Y & Z]
Поскольку клонирование файла создаёт его точную копию, становится невозможно обращаться к исходному файлу ни по имени, ни по тегам. Поэтому, сразу после клонирования желательно изменить имя клона. Команда clone возвращает дескриптор созданной версии файла, так что мы можем присвоить его временной переменной, а потом произвести переименование для этой переменной:
var $clonedFile = clone X [Y & X]
rename $clonedFile to T
Используя конвеерную форму записи, предыдущие команды можно записать так:
clone X[Y & Z] | rename to T
Если мы заодно хотим сбросить теги Y и Z с созданной копии, можно выполнить команду reset:
clone X[Y & Z] | rename to T | reset [Y, Z]
clone X[Y & Z] | reset [Y, Z] | rename to T
TFS может "сосуществовать" вместе с иерархическими системами. Для этого предусмотрены команды импорта и экспорта файлов из/в TFS.
var $importedFiles = import from "c:/My Music/Nirvana"
set [Избранное] for $importedFiles
Предыдущие команды могут быть записаны в конвеерной форме:
import from "c:/My Music/Nirvana" | set [Избранное]
Команда import достаточно интеллектуальна, чтобы проставить теги [Audio] и [Video] для медиа-файлов.
export [Audio] to "C:\My Music"
В системах, поддерживающих теги, часто возникают ситуации, когда у нескольких файлов проставлены теги, сходные по смыслу, но отличные по написанию. Например, у нескольких аудио-альбомов может встречаться различное написание имени исполнителя. Для разрешения подобных ситуаций существует команда merge.
merge DDT [Artist] to ДДТ [Artist]
Данная команда заменяет тег [DDT] у всех файлов в системе на тег [ДДТ] и удаляет файл DDT [Artist] из системы. По сути, команда merge - это сокращенная запись для команд
set [ДДТ [Artist]] for [DDT [Artist]]
delete DDT [Artist]
Додумать: На файл ДДТ надо перенести все теги с файла DDT
select Дезертир -- выбор файла по имени
select "Генератор зла" -- тоже выбор файла по имени (в данном случае файл является тегом)
select ["Генератор зла"] -- выбор всех файлов с тегом ["Генератор зла"]. В нашем примере результатом будет 4 файла.
select ["Генератор зла" & Video] -- выбор файлов с тегами ["Генератор зла"] И [Video]. У нас всего один видео-файл.
select [Audio | Video] -- файлы с тегами [Audio] ИЛИ [Video].
select [[Audio]] -- файлы с тегами, помеченными тегом [Audio].
select [~Audio] -- рекурсивный запрос выбора всех файлов с тегами [Audio], [[Audio]], [[[Audio]]], ...
Некоторые теги могут иметь параметры, ассоциированные с файлом, на котором проставлены эти теги. Так, например, тег [Audio] имеет параметры Duration, Codec, Bitrate и т.п. Сами по себе эти параметры смысла не имеют до тех пор, пока тег [Audio] не будет присвоен какому-либо аудио-файлу. Данные параметры вычисляются динамически при каждом запросе. Список параметров тега и алгоритм их вычисления находятся в теле файла тега. Используя вычислимые параметры, возможно сужать область поиска файлов. Если мы, скажем, хотим найти все аудио-файлы с продолжительностью более 5 минут 20 секунд, мы можем написать такой запрос:
select [Audio(Duration > 05:20)]
Разумеется, такой запрос существенно снижает скорость поиска, поскольку алгоритм определения продолжительности аудио-файла выполняется для каждого файла.
Если необходимо часто работать с аудио-файлами с длительностью более 05:20, можно проставить тег ">05:20" для таких файлов:
set [">05:20"] for [Audio(Duration > 05:20) & !">05:20"]
Данный тег не является динамическим, и вычисляется только один раз при присвоении. При изменении длительности аудио-файла тег необходимо будет проставлять снова:
reset [">05:20"] for [Audio]
set [">05:20"] for [Audio(Duration > 05:20)]
Мощь TFS может обернуться против пользователя, если он будет недостаточно внимателен, модифицируя файлы. Скажем, операция "delete [!System]" удалит все файлы, не имеющие тега [System]. Данная проблема пока не имеет решения. Возможно, следует подумать над созданием алгоритма определения степени опасности операции.
Рассмотрим ситуацию: имеется файл "Отчётность за сентябрь" [Отчётность], который добавлен в избранные документы в программе составления отчётности (ПСО). Злоумышленник создаёт второй файл с таким же именем, но с тегами [Отчётность, Хак]. Поскольку ПСО ищет файл с помощью команды select "Отчётность за сентябрь" [Отчётность], и оба файла подпадают под этот запрос, становится невозможно определить какой именно файл нужно открывать. ПСО, конечно, может спросить об этом пользователя, но он может не всегда правильно выбрать файл.
Для исключения подобной ситуации ПСО должна присвоить файлу свой уникальный тег, скажем, [ПСО-5637485091], который может присваивать только она (триггер, срабатывающий при присвоении этого тега, запрещает операцию, если исполняемый файл проставляющей программы не имеет этого тега). Тег [ПСО-5637485091] должен иметь уникальное имя, то есть на нём должен быть проставлен тег [UniqueId]. Теперь запрос на выборку файла будет таким: select [ПСО-5637485091]
System : Hidden & Frozen & UniqueId - файлы, имеющие данный тег, являются системными. Такие файлы имеют особое значение в файловой системе: их невозможно удалить. Поскольку данный тег является наследником тега [Hidden], все системные теги не выводятся в поисковых выборках. Имена системных тегов являются уникальными в пределах всей файловой системы. Несмотря на то, что данный тег не помечен тегом [System], он наследует этот тег от своих родительских тегов.
Executable [System] - данным тегом помечаются файлы, содержащие исполняемый код.
Hidden [System] - файлы, помеченные данным тегом, не выводятся в стандартных поисковых выборках (select).
Frozen [System] - файлы, помеченные данным тегом, не могут быть модифицированы или переименованы; им не могут быть присвоены новые теги, и с них нельзя снять существующие теги, в том числе и сам тег [Frozen]. Проставить и снять этот тег можно лишь имея права администратора.
UniqueId [System] - файлы, помеченные данным тегом, гарантированно имеют уникальное имя в пределах файловой системы. Попытка создания файла с таким же именем приведёт к ошибке. Файлы с уникальным именем можно переименовывать только в том случае, если новое имя окажется уникальным.
Рис. 2. Иерархия системных тегов.
Незакрашенные стрелки - наследование, закрашенные - теговая ассоциация
Список будет пополняться...
Запуск программы Photoshop CS5:
run Photoshop [CS5]
Листинг всех кистей, зарегистрированных в программе Photoshop CS5:
select [Brushes [Photoshop [CS5]]]
Клонирование Photoshop CS5 (создание резервной копии):
var $clonedFiles = clone [Photoshop [CS5]]
set bidirectional ["Reserved Copy"] for (select Photoshop [CS5] from $clonedFiles)
Инсталляция плагина Plugin3:
clone [Plugin3] | set [Photoshop [CS5 & !"Reserved Copy"]]
Деинсталляция плагина Plugin1 из Photoshop CS5 (резервная копия не затрагивается):
delete [Plugin1 [Plugins [Photoshop [CS5 & !"Reserved Copy"]]]]
Деинсталляция программы Photoshop CS5 (резервная копия тоже удалится!):
delete [Photoshop [CS5]]
Деинсталляция программы Photoshop CS5 с сохранением резервной копии:
delete [Photoshop [CS5 & !"Reserved Copy"]]
Деинсталляция всех версий программы Photoshop (в т.ч. резервной копии):
delete [Photoshop]
В общем-то мне нравится =) (с) Destiny