System.IO.Directory.EnumerateFiles 和 System.IO.Directory.GetFiles 的问题

麦壳饼 2017-04-24 11:26:20
System.IO.Directory.GetFiles 在 目录里 文件量相当大时卡太久 !
所以 使用了 System.IO.Directory.EnumerateFiles , 大量文件时 这个方法没问题, 但有时候会锁死目录。 不知道啥情况。
当文件夹内存了 几十万文件时 , 如何快速列举?
大家有没有好方法。
因为 网络正常情况下 文件都是发送走了的, 但是断网的时候这些文件就积压了。
所以, 大家有没有好方法应对这种问题。
...全文
448 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel6709 2017-04-25
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
图片服务器不要说上万,几十万,几百万都是很正常的事情,但图片服务器才不会来遍历文件夹下面的内容,他们都是将路径存储在各个位置,可以通过算法或者其它辅助路径来快速找到文件
stherix 2017-04-25
  • 打赏
  • 举报
回复
引用 7 楼 diaodiaop 的回复:
[quote=引用 5 楼 stherix 的回复:] 文件夹里存几十万文件就说明设计有问题 要用其他方法来缓存需要发送的内容
不能这么说吧... 假设是用户头像或者是用户上传的东西 上传10W个图片 很正常啊.. 这难道说明设计有问题?? [/quote] 我是没见过要上传10万个图片的应用
引用
因为 网络正常情况下 文件都是发送走了的, 但是断网的时候这些文件就积压了。
而且这些图片在断网情况下还会不断的累积 就算这是重要的日志文件,要把日志传到服务器上也最好是用数据库 或者用合适的方式在写文件的时候对其进行合并,尽量减少文件个数 而且也要设置日志的最大个数,或者数据库大小 总不能就这么让占满整个硬盘
by_封爱 版主 2017-04-25
  • 打赏
  • 举报
回复
引用 5 楼 stherix 的回复:
文件夹里存几十万文件就说明设计有问题 要用其他方法来缓存需要发送的内容
不能这么说吧... 假设是用户头像或者是用户上传的东西 上传10W个图片 很正常啊.. 这难道说明设计有问题??
xian_wwq 2017-04-25
  • 打赏
  • 举报
回复
引用 楼主 mysticboy 的回复:
System.IO.Directory.GetFiles 在 目录里 文件量相当大时卡太久 ! 所以 使用了 System.IO.Directory.EnumerateFiles , 大量文件时 这个方法没问题, 但有时候会锁死目录。 不知道啥情况。 当文件夹内存了 几十万文件时 , 如何快速列举? 大家有没有好方法。 因为 网络正常情况下 文件都是发送走了的, 但是断网的时候这些文件就积压了。 所以, 大家有没有好方法应对这种问题。
因为异常中断的时间无法预知,所以感觉还是需要人为设定缓存文件的上限,不能是无限制的。 如果客户同意,给生成的文件设定数量上限,一旦超过上限,循环进行覆盖,保证总体数量可控; 如果文件非常重要,不能循环覆盖,可以通过监测文件夹变化,创建文件索引 或移动文件到子文件夹的形式, 原则就是可检索和拆分,保证单个文件夹中数量可控, 否则通过遍历的形式很容易就把程序拖死了。
stherix 2017-04-25
  • 打赏
  • 举报
回复
文件夹里存几十万文件就说明设计有问题 要用其他方法来缓存需要发送的内容
tanta 2017-04-25
  • 打赏
  • 举报
回复
The EnumerateFiles and GetFiles methods differ as follows: When you use EnumerateFiles, you can start enumerating the collection of names before the whole collection is returned; when you use GetFiles, you must wait for the whole array of names to be returned before you can access the array. Therefore, when you are working with many files and directories, EnumerateFiles can be more efficient.。 -----------来自msdn。 也就是说,getFiles是必须整个读完才返回,而EnumerateFiles是可以在返回整个collection 前就直接开始enumerating,所以你才有getfiles卡死的感觉,而 EnumerateFiles没有。 从你的描述来看,你是生成n多小文件来缓存网络数据。如果我没猜错的话,我感觉这种方式是不可取的。缓存最好在内存中开辟,迫不得已需要用磁盘缓存,也要尽量避免生成多个小文件的方式。
  • 打赏
  • 举报
回复
引用 2 楼 qq_25095899 的回复:
[quote=引用 1 楼 starfd 的回复:] 为啥不考虑弄个数据库列表对应呢,这样遍历就依赖数据库了
有可能文件生成的时候不是楼主能控制的,他只能被动的去处理文件夹里的东西。[/quote] 那也可以通过FileSystemWatcher来监控变化的
大然然 2017-04-24
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
为啥不考虑弄个数据库列表对应呢,这样遍历就依赖数据库了
有可能文件生成的时候不是楼主能控制的,他只能被动的去处理文件夹里的东西。
  • 打赏
  • 举报
回复
为啥不考虑弄个数据库列表对应呢,这样遍历就依赖数据库了

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧