C#非递归统计一个文件夹的大小 求高手...

茶语 2013-07-25 11:30:55
现在大部分统计文件夹大小都是递归方式。

有没有其他的解决方式,求指教
...全文
315 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
烈火蜓蜻 2013-07-26
  • 打赏
  • 举报
回复
函数(路径) { 把当前路径加入到队列 循环(队列不为空) { var 路径=队列首元素出列 if(判断路径是否有权限访问), 没有权限访问,就Continue。 获取路径下所有的文件。 处理文件。 获取路径下所有的子文件夹。 把所有的文件夹加入到子队列。 } }
threenewbee 2013-07-26
  • 打赏
  • 举报
回复
需要回溯的,只能递归。 所谓不用递归,无非两种,一个是某个API内部封装了递归操作,使得你可以直接调用,或者借助堆栈等数据结构保存回溯的状态,其实还是递归,只是放弃使用系统堆栈。
敌敌畏耶 2013-07-26
  • 打赏
  • 举报
回复
递归 如果处理不好,就很容易搞成死死循环,堆栈溢出···
tcmakebest 2013-07-26
  • 打赏
  • 举报
回复
递归怎么了,文件夹是树形结构,不用递归还能用什么啊?
敌花师 2013-07-26
  • 打赏
  • 举报
回复
递归不好么?说出问题一起解决。
烈火蜓蜻 2013-07-26
  • 打赏
  • 举报
回复
用队列就可以不用递归了。
烈火蜓蜻 2013-07-26
  • 打赏
  • 举报
回复
引用 15 楼 weizhuangwen 的回复:
[quote=引用 9 楼 Linux7985 的回复:] [quote=引用 8 楼 weizhuangwen 的回复:] [quote=引用 7 楼 Linux7985 的回复:] 函数(路径) { 把当前路径加入到队列 循环(队列不为空) { var 路径=队列首元素出列 if(判断路径是否有权限访问), 没有权限访问,就Continue。 获取路径下所有的文件。 处理文件。 获取路径下所有的子文件夹。 把所有的文件夹加入到子队列。 } }
有意思!这想法好。 但“获取路径下所有的子文件夹”,这个是否算已经递归了?[/quote] 是当前文件夹的子文件夹,没有包含子文件夹的子文件夹。,[/quote] 我知道“没有包含子文件夹的子文件夹”,不然也不会说你的想法好。 但如果“递归无非就是隐式的使用了一个堆栈”的话,你这个“循环(队列不为空)”内的代码看做是一个堆栈的话,那么也算是递归了。[/quote] 你看来,你对递归的定义与众不同
风吹腚腚凉 2013-07-26
  • 打赏
  • 举报
回复
12楼的哥们,你这个代码的原理跟递归是一样的,都是不停的寻找子文件夹的下一层,无非写法不一样,原理是一样的。
weizhuangwen 2013-07-26
  • 打赏
  • 举报
回复
打开C盘,选择"WINDOWS"文件夹,点击属性。接着。。你会看到文件夹大小不停的上涨。 说明:连windows操作系统本身都是用递归去统计所有文件大小的。
weizhuangwen 2013-07-26
  • 打赏
  • 举报
回复
http://www.zhihu.com/question/20418254 这里面说得很详细
zorou_fatal 2013-07-26
  • 打赏
  • 举报
回复
用堆栈操作即可。
weizhuangwen 2013-07-26
  • 打赏
  • 举报
回复
引用 9 楼 Linux7985 的回复:
[quote=引用 8 楼 weizhuangwen 的回复:] [quote=引用 7 楼 Linux7985 的回复:] 函数(路径) { 把当前路径加入到队列 循环(队列不为空) { var 路径=队列首元素出列 if(判断路径是否有权限访问), 没有权限访问,就Continue。 获取路径下所有的文件。 处理文件。 获取路径下所有的子文件夹。 把所有的文件夹加入到子队列。 } }
有意思!这想法好。 但“获取路径下所有的子文件夹”,这个是否算已经递归了?[/quote] 是当前文件夹的子文件夹,没有包含子文件夹的子文件夹。,[/quote] 我知道“没有包含子文件夹的子文件夹”,不然也不会说你的想法好。 但如果“递归无非就是隐式的使用了一个堆栈”的话,你这个“循环(队列不为空)”内的代码看做是一个堆栈的话,那么也算是递归了。
threenewbee 2013-07-26
  • 打赏
  • 举报
回复
引用 楼主 zcwxtd 的回复:
现在大部分统计文件夹大小都是递归方式。 有没有其他的解决方式,求指教
顺便说下,循环可以看作递归的特例——回溯深度始终为1。
effun 2013-07-26
  • 打赏
  • 举报
回复
完整的演示代码在这里下载: http://files.cnblogs.com/effun/Csdn390529029.zip
effun 2013-07-26
  • 打赏
  • 举报
回复
递归无非就是隐式的使用了一个堆栈,因为这个需求并不十分复杂,我们可以用自己的堆栈来代替递归。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    string path = (string)e.Argument;

    Stack<DirectoryInfo> stack;
    DirectoryInfo dir;
    long sum = 0;

    dir = new DirectoryInfo(path);

    if (dir.Exists)
    {
        stack = new Stack<DirectoryInfo>();
        stack.Push(dir);

        while (stack.Count > 0)
        {
            dir = stack.Pop();
            backgroundWorker1.ReportProgress(0, dir);
            try
            {
                sum += dir.GetFiles().Sum(o => o.Length);
            }
            catch (UnauthorizedAccessException)
            {
                continue;
            }

            var subdirs = dir.GetDirectories();

            foreach (var sub in subdirs)
            {
                stack.Push(sub);
            }

        }
    }
    else
        sum = -1;

    e.Result = sum;
}
烈火蜓蜻 2013-07-26
  • 打赏
  • 举报
回复
引用 10 楼 wjfwd2010 的回复:
[quote=引用 9 楼 Linux7985 的回复:] [quote=引用 8 楼 weizhuangwen 的回复:] [quote=引用 7 楼 Linux7985 的回复:] 函数(路径) { 把当前路径加入到队列 循环(队列不为空) { var 路径=队列首元素出列 if(判断路径是否有权限访问), 没有权限访问,就Continue。 获取路径下所有的文件。 处理文件。 获取路径下所有的子文件夹。 把所有的文件夹加入到子队列。 } }
有意思!这想法好。 但“获取路径下所有的子文件夹”,这个是否算已经递归了?[/quote] 是当前文件夹的子文件夹,没有包含子文件夹的子文件夹。,[/quote] 我也认为不用递归是不可能实现的就算看来你的代码我也认为你不用递归也不可能实现。 理由很简单,你不可能知道你的一个文件夹里包含了多少个子文件夹。这是 一个需要递归才能采集出来的数据。 因为子文件夹中有没有子文件夹是个未知数。[/quote] 你的理由很奇怪。 你照我的写的做吧,看看会怎么样, 还有所有递归的代码基本上都可以用非递归实现
风吹腚腚凉 2013-07-26
  • 打赏
  • 举报
回复
引用 9 楼 Linux7985 的回复:
[quote=引用 8 楼 weizhuangwen 的回复:] [quote=引用 7 楼 Linux7985 的回复:] 函数(路径) { 把当前路径加入到队列 循环(队列不为空) { var 路径=队列首元素出列 if(判断路径是否有权限访问), 没有权限访问,就Continue。 获取路径下所有的文件。 处理文件。 获取路径下所有的子文件夹。 把所有的文件夹加入到子队列。 } }
有意思!这想法好。 但“获取路径下所有的子文件夹”,这个是否算已经递归了?[/quote] 是当前文件夹的子文件夹,没有包含子文件夹的子文件夹。,[/quote] 我也认为不用递归是不可能实现的就算看来你的代码我也认为你不用递归也不可能实现。 理由很简单,你不可能知道你的一个文件夹里包含了多少个子文件夹。这是 一个需要递归才能采集出来的数据。 因为子文件夹中有没有子文件夹是个未知数。
烈火蜓蜻 2013-07-26
  • 打赏
  • 举报
回复
引用 8 楼 weizhuangwen 的回复:
[quote=引用 7 楼 Linux7985 的回复:] 函数(路径) { 把当前路径加入到队列 循环(队列不为空) { var 路径=队列首元素出列 if(判断路径是否有权限访问), 没有权限访问,就Continue。 获取路径下所有的文件。 处理文件。 获取路径下所有的子文件夹。 把所有的文件夹加入到子队列。 } }
有意思!这想法好。 但“获取路径下所有的子文件夹”,这个是否算已经递归了?[/quote] 是当前文件夹的子文件夹,没有包含子文件夹的子文件夹。,
weizhuangwen 2013-07-26
  • 打赏
  • 举报
回复
引用 7 楼 Linux7985 的回复:
函数(路径) { 把当前路径加入到队列 循环(队列不为空) { var 路径=队列首元素出列 if(判断路径是否有权限访问), 没有权限访问,就Continue。 获取路径下所有的文件。 处理文件。 获取路径下所有的子文件夹。 把所有的文件夹加入到子队列。 } }
有意思!这想法好。 但“获取路径下所有的子文件夹”,这个是否算已经递归了?

110,571

社区成员

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

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

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