首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >列出目录(包括子目录)中所有文件的最有效方法是什么?

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

Stack Overflow用户
提问于 2010-03-20 02:56:06
回答 4查看 1.1K关注 0票数 1

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-20 03:06:59

磁盘访问很慢,并且随着文件和目录数量的增加,当使用传统的递归搜索目录树时,您的servlet将很快变得无用。如果有大量并发用户同时执行相同的搜索,您将特别快地达到此限制。

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

代码语言:javascript
运行
复制
find <path_to_directory> -name '*.bin' > list_files.txt

这将列出特定目录中以.bin结尾的每个文件名,并将其输出到名为list_files.txt的文件中。然后,您的servlet可以读取该文件并从中创建文件列表。

票数 2
EN

Stack Overflow用户

发布于 2010-03-20 03:03:38

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

你可以在谷歌上搜索到许多如何使用"find“的例子。

票数 1
EN

Stack Overflow用户

发布于 2010-03-20 03:08:45

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

1)磁盘I/O时间太长。这将是一个你无能为力的真正的约束。通常,操作系统非常擅长在内存中保留结构,使其能够更快地找到文件夹中的文件。如果它太慢了,你可能不得不自己在内存中建立一个索引。这完全取决于你是怎么做的。

在任何情况下,如果这就是问题所在(你可以尝试测量),那么做过滤客户端是不会有帮助的,因为无论你在哪里做,这应该不会花很长时间。相反,您将通过向客户端发送更多数据来排序,从而使客户端变得更慢。

2)你的目录遍历有问题。你说它是“递归的”。如果你的意思是它实际上是递归的,即每当它遇到一个新的目录就会调用它自己的方法,那么这很可能会减慢你的速度(开销真的会增加)。在维基百科上有一些关于tree traversal的东西,但基本上只是使用队列或堆栈来跟踪您在遍历中所处的位置,而不是使用您的方法状态来执行此操作。

请注意,文件系统实际上不是树,但我假设它在本例中是树。不然的话,它会变得更多毛。

我不同意其他帖子所说的,你不能在过程中实现它。在某种程度上,它应该工作得很好,现在还不需要批处理作业。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2479868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档