代码之家  ›  专栏  ›  技术社区  ›  Michael Balint

列出目录(包括子目录)中所有文件的最有效方法是什么?

  •  1
  • Michael Balint  · 技术社区  · 16 年前

    我正在编写一个servlet,它将检查服务器上的一个目录(web容器外部),并递归地搜索某些文件(通过某些文件,我指的是具有特定扩展名和特定命名约定的文件)。一旦找到这些文件,servlet就会给出所有找到的文件的长列表(包括文件的完整路径)。我的问题是有太多的文件和目录,我的servlet运行非常慢。我想知道是否有一个最佳实践或现有的servlet来解决这类问题?简单地编译整个文件列表并在客户端通过js/jquery进行过滤会更有效吗?

    4 回复  |  直到 16 年前
        1
  •  2
  •   Aaron    16 年前

    相反,使用外部批处理作业来生成文件列表要好得多,这些文件可以通过数据库调用读入servlet,甚至只需解析包含由换行符分隔的所有文件名的文件。在Linux上使用“find”是一种简单的方法。

    find <path_to_directory> -name '*.bin' > list_files.txt
    

        2
  •  1
  •   Alexander Malfait    16 年前

    如果您确实有大量的文件,您可能会考虑派生一个外部进程来执行搜索。如果您在类unix的服务器(如linux)上运行,则可以通过使用“find”命令搜索并解析其输出来提高速度。

        3
  •  1
  •   wds    16 年前

    我认为这一进程可能进展缓慢的原因有两个:

    1) 磁盘I/O时间过长。这将是一个真正的限制,你不能做太多。通常,操作系统非常擅长在内存中保留结构,以便更快地找到文件夹中的文件。如果速度太慢,则可能需要自己在内存中构建索引。这完全取决于你怎么做。

    在任何情况下,如果这是一个问题(你可以尝试测量),那么没有办法做过滤客户端将有帮助,因为这不应该真的需要很长时间,无论你在哪里做。相反,您将通过发送更多的数据进行排序来降低客户端的速度。

    tree traversal 在wikipedia上,但基本上只是使用队列或堆栈来跟踪遍历的位置,而不是使用方法状态来跟踪。

    请注意,文件系统实际上不是树,但我假设在本例中是树。否则它会变得有点毛茸茸的。

        4
  •  0
  •   antony    16 年前

    我认为你的servlet运行缓慢是因为硬盘速度太快。如果文件列表是永久的,你应该把它载入内存