2010-11-29 3 views
0

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

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

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

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

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

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

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

Спасибо!

ответ

1

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

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

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

HTH, nate.

0

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

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

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

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

Смежные вопросы