Получить структуру дерева каталогов UNIX в объект JSON - PullRequest
0 голосов
/ 29 ноября 2010

Я пытаюсь создать приложение для браузера, которое визуализирует файловые структуры, поэтому я хочу напечатать файловую структуру в объект JSON.

Я пытался использовать множество вариантов 'ls' для sed, но кажется, что find работает лучше всего.

Сейчас я просто пытаюсь использовать команду

find ~ -maxdepth ? -name ? -type d -print

И токенизировать переменные пути

Я пробовал просто ajax с PHP-exec, но обход массива очень медленный.Я думал сделать это прямо из скрипта bash, но я не могу понять, как получить сквозную ссылку для ассоциативных массивов, чтобы рекурсивно добавить все токенизированные переменные пути в дерево.

Есть лилучший или устоявшийся способ сделать это?

Спасибо!

Ответы [ 2 ]

1 голос
/ 29 ноября 2010

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

По сути, вы пишете две темы.Первый очищает файловые структуры и создает в базе данных представление их содержимого.Второй отвечает на запросы браузера, запрашивает базу данных, созданную первым потоком, и генерирует ваш JSON (т. Е. Обычный поток обработчика веб-запросов).

Абстрагируя базовую структуру хранения (файловую систему), вы создаетеслой, который может добавить параллелизм, иметь дело с ошибками ввода-вывода и т. д. Когда кто-либо изменяет файл в структуре, он не виден веб-клиентам, пока поток «скребка» не обнаружит изменение и не обновит базу данных.Однако, поскольку веб-запросы не привязаны к чтению базовой файловой структуры и просто запрашивают базу данных, время ответа должно быть быстрым.

HTH, nate.

0 голосов
/ 29 ноября 2010

Ходьба по диску всегда будет медленнее идеальной, просто из-за всех поисков, которые нужно сделать. Если это не проблема для вас, я бы посоветовал поработать над устранением накладных расходов ... начиная с минимизации количества вызовов fork (). Тогда вы можете просто кешировать результат так долго, как считаете нужным.

Поскольку вы уже упомянули PHP, я предлагаю написать всю вашу серверную систему на PHP и использовать классы DirectoryIterator или RecursiveDirectoryIterator . Вот SO ответ для чего-то похожего на то, что вы просили реализовать с помощью первого.

Если возникают проблемы с дисковым вводом-выводом, я советую реализовать систему по принципу mlocate , которая кэширует список каталогов вместе с каталогом ctimes и использует stat () для сравнения ctimes и только перечитайте каталоги, содержимое которых изменилось.

Я не слишком много работаю с файловой системой в PHP, но, если бы это помогло, я могу предложить вам реализацию Python базового процесса updatedb в стиле mlocate. (Я использую его для индексации файлов, которые должны быть восстановлены с DVD + R вручную, если мой привод когда-либо выходит из строя, потому что они слишком велики, чтобы удобно помещаться на моем целевом диске rdiff-backup) *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...