【问题标题】:Get UNIX directory tree structure into JSON object将 UNIX 目录树结构获取到 JSON 对象中
【发布时间】:2011-05-17 03:08:36
【问题描述】:

我正在尝试构建一个可视化文件结构的浏览器应用程序,因此我想将文件结构打印到 JSON 对象中。

我尝试过使用管道传输到 sed 的多种“ls”变体,但似乎 find 效果最好。

现在我只是尝试使用命令

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

并标记路径变量

我已经用 PHP-exec 尝试了简单的 ajax,但是数组遍历真的很慢。 我想直接从 bash 脚本中执行此操作,但我不知道如何获取关联数组的传递引用以递归地将所有标记化路径变量添加到树中。

有没有更好或成熟的方法来做到这一点?

谢谢!

【问题讨论】:

    标签: php javascript json filesystems unix


    【解决方案1】:

    我不知道您的应用程序的要求是什么,但解决您的问题(以及许多其他问题)的一种解决方案是将实际的文件系统布局隐藏在抽象层后面。

    本质上,您编写了两个线程。第一个抓取文件结构并创建其内容的数据库表示。第二个响应浏览器请求,查询第一个线程创建的数据库,并生成您的 JSON(即普通的 Web 请求处理程序线程)。

    通过抽象底层存储结构(文件系统),您可以创建一个可以添加并发、处理 IO 错误等的层。当有人更改该结构中的文件时,Web 客户端直到“scraper”才能看到它" 线程检测到更改并更新数据库。但是,由于 Web 请求与读取底层文件结构无关,而只是查询数据库,因此响应时间应该很快。

    HTH, 纳特。

    【讨论】:

      【解决方案2】:

      遍历磁盘总是比理想速度慢,这仅仅是因为需要进行所有查找。如果这对您来说不是问题,我的建议是努力消除开销......从最小化 fork() 调用的数量开始。然后,您可以将结果缓存到您认为合适的时间。

      既然您已经提到了 PHP,我的建议是用 PHP 编写您的整个服务器端系统并使用 DirectoryIteratorRecursiveDirectoryIterator 类。这是一个SO answer,类似于您要求使用前者实现的内容。

      如果磁盘 I/O 开销是个问题,我的建议是按照mlocate 的方式实现一个系统,它将目录列表与目录 ctimes 一起缓存,并使用 stat() 比较 ctimes 并仅重新读取内容已更改的目录。

      我没有在 PHP 中做很多文件系统工作,但是,如果有帮助,我可以为您提供基本 mlocate 样式 updatedb 进程的 Python 实现。 (如果我的驱动器出现故障,我用它来索引必须手动从 DVD+R 恢复的文件,因为它们太大而无法舒适地放在我的 rdiff-backup 目标驱动器上)

      【讨论】:

        【解决方案3】:

        9 年后... 使用 tree 应该可以完成这项工作。

        tree ~ -J -L ? -P '?' -d --noreport

        地点:

        • -J 输出为 json
        • -L 最大级别深度(相当于找到-maxdepth)
        • 要包含的-P 模式(相当于查找-name)
        • 仅-d 目录(相当于查找-type d)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-06
          • 2019-08-20
          • 1970-01-01
          • 2021-11-09
          • 1970-01-01
          • 1970-01-01
          • 2015-10-15
          • 2013-01-07
          相关资源
          最近更新 更多