将UNIX目录树结构获取到JSON对象中

时间:2010-11-29 06:42:37

标签: php javascript json filesystems unix

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

我尝试使用很多'ls'管道传输给sed,但看起来效果最好。

现在我只想尝试使用命令

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

并标记路径变量

我尝试使用PHP-exec这个简单的ajax,但是数组行走非常慢。 我正在考虑直接从bash脚本执行此操作,但我无法弄清楚如何获取关联数组的pass-by-reference以递归方式将所有标记化路径变量添加到树中。

有没有更好或既定的方法来做到这一点?

谢谢!

3 个答案:

答案 0 :(得分:1)

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

基本上,你写两个线程。第一个擦除文件结构并创建其内容的数据库表示。第二个响应浏览器请求,查询第一个线程创建的数据库,并生成您的JSON(即正常的Web请求处理程序线程)。

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

HTH, 内特。

答案 1 :(得分:0)

走在磁盘上总是比理想慢,只是因为需要完成的所有搜索工作。如果这不是你的问题,我的建议是努力消除开销......从最小化fork()调用的数量开始。然后,您可以根据自己认为合适的时间缓存结果。

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

如果磁盘I / O开销有问题,我的建议是实现一个mlocate行的系统,该系统将目录列表与目录ctimes一起缓存,并使用stat()来比较ctimes并且只返回-read内容已更改的目录。

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

答案 2 :(得分:0)

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

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

其中:

  • -J输出为json
  • -L最大水平深度(等于找到-maxdepth)
  • -P模式包含(等同于查找-name)
  • -d目录(等同于查找-type d)