Конечно, вы можете сканировать файловую систему и собирать метаданные о каждом файле и каталоге, а затем сохранять их в базе данных. Но эта информация не может заменить информацию файловой системы, только ее «копию».
Я бы имел (как минимум) 2 таблицы: Files
и Directories
. Файл будет иметь dir_id. Каталог будет иметь как dir_id для себя, так и parent_id для перехода по дереву каталогов. Верх дерева («корень») будет нулем или нулем.
Мягкие ссылки, жесткие ссылки, устройства, монтирования, / proc и т. Д. Добавят проблем, но, может быть, вас это не волнует?
size
должно быть BIGINT
. permissions
, если закодировано, может вписаться в SMALLINT UNSIGNED
или может быть сохранено как строка. user
и group
могут быть либо идентификатором, либо строкой; вам может понадобиться таблица id: name для пользователей и одна для групп. Для date
рассмотрим TIMESTAMP
или, может быть DATETIME
; имейте в виду, что ОС может делать что-то ближе к TIMESTAMP
для работы с часовыми поясами. (Возможно, Windows отличается.)
Если вы храните копии файлов, я рекомендую использовать другую таблицу, связанную с Files
через file_id
. Но, будьте осторожны, LONGBLOB
ограничен 4 ГБ, и есть другие настройки, которые затрудняют хранение чего-либо большего, чем 16 МБ. Итак, я мог бы предложить разбить на куски что-нибудь больше, чем 64 КБ, сжать куски и т. Д. (Для этого, вероятно, потребуется еще одна таблица.)
Что касается восстановления полного пути из "иерархии", которую я предложил выше, то это всего лишь небольшой объем кода. Это можно сделать в коде вашего приложения или в хранимой процедуре. В MySQL 8.0 или MariaDB 10.2 доступны «CTE» для облегчения детализации дерева.
(Да, я делал большинство этих вещей в нескольких проектах в прошлом.)