• 9710阅读
  • 6回复

求助:不用递归统计所有的文件大小 [复制链接]

上一主题 下一主题
离线finaleden
 
只看楼主 倒序阅读 楼主  发表于: 2008-11-12
— 本帖被 XChinux 执行加亮操作(2008-11-30) —
我想知道 如何 不用递归 就能统计所有的文件大小 急求算法
(难点是 文件夹下又含有文件夹和文件 .......)

真是难死我了!!

请 各位帮助啊!!!!!!!!!!!!!!!!
QQ: 9402369
MSN: fantasyeden@hotmail.com
E-mail: finaleden@163.com
上善若水 厚德载物
离线lazybone
只看该作者 1楼 发表于: 2008-11-12
//不用递归统计所有的文件
import java.io.File;
import java.util.LinkedList;
public class FileSystem {
    public static void main(String[] args) {
       
        long a = System.currentTimeMillis();
       
        LinkedList list = new LinkedList();
        File dir = new File("c:\\java\\");
        File file[] = dir.listFiles();
        for (int i = 0; i < file.length; i++) {
            if (file.isDirectory())
                list.add(file);
            else
                System.out.println(file.getAbsolutePath());
        }
        File tmp;
        while (!list.isEmpty()) {
            tmp = list.removeFirst();
            if (tmp.isDirectory()) {
                file = tmp.listFiles();
                if (file == null)
                    continue;
                for (int i = 0; i < file.length; i++) {
                    if (file.isDirectory())
                        list.add(file);
                    else
                        System.out.println(file.getAbsolutePath());
                }
            } else {
                System.out.println(tmp.getAbsolutePath());
            }
        }
       
        System.out.println(System.currentTimeMillis() - a);
    }
}
离线finaleden
只看该作者 2楼 发表于: 2008-11-12
这是 我目前的代码
void CFileBrowser::spaceCalculate( const QString & dir )
{
    QDir d( dir );
    QString pathTemp; //临时路径   
   
    if( d.exists() && !d.isReadable() ) return;
        d.setFilter( QDir::Dirs | QDir::Files ); //设置过滤器,列出目录和文件
    d.setSorting( QDir::Name | QDir::DirsFirst | QDir::IgnoreCase | QDir::Reversed );//设置排列顺序,            
    //返回这个目录中所有目录和文件的QFileInfo对象的列表
  const QFileInfoList * list = d.entryInfoList();
    QFileInfoListIterator it( *list );
    QFileInfo *fi;
    while( (fi = it.current()) )
    {                    //空目录情况
        if( (fi->fileName() == ".") || (fi->fileName() == "..") )
        {
               pathTemp = fi->filePath();                          //获得路径
           spaceDir += QFileInfo(pathTemp).size();
           ++it;
           continue;
        }
        //文件情况
        if(fi->isFile())
        {
               pathTemp = fi->filePath(); //获得文件路径
               spaceDir += QFileInfo(pathTemp).size();
               ++it;
                continue;
        }
        //处理目录
        if (fi->isDir())
        {
               pathTemp = fi->filePath(); //获得文件路径
           spaceDir += QFileInfo(pathTemp).size();
            //进入该目录,递归调用计算其包含文件/目录的大小
          //  spaceCalculate(pathTemp);
            ++it;
            continue;
        }
            ++it;
    }
}

可以针对 我这个 改进一下吗? (QT的)
上善若水 厚德载物
离线finaleden
只看该作者 3楼 发表于: 2008-11-12
加上 这句递归  spaceCalculate(pathTemp) 后 当 内容大了(2G)之后效率低得吓死人
上善若水 厚德载物
离线finaleden
只看该作者 4楼 发表于: 2009-04-10
我需要 C++ 或者 C  的实现 (QT )
上善若水 厚德载物
离线琳瑞o
只看该作者 5楼 发表于: 2009-04-19
《三国记》之江山美人
在4月22日13:00 飞游互动  三国类网页游戏《三国记》首服 【江山美人】进行公测,请大家拭目以待。《三国记》官方网址: 点击访问



        问天下英雄,谁人不爱江山,谁人不想拥有美人!三国类网页游戏《三国记》隆重推出的【江山美人】将助您成就霸业,一匡天下。乱世造就几多悲歌,也成就几多英雄,古有盖世英雄西楚霸王之称的“项羽”,爱江山更爱美人...今天历史将有您来改写,就是你,广邀天下英雄美女,共赴《三国记》包揽江山与美人,建千秋功业,留万古英明。还等待什么,快快加入《三国记》首服【江山美人】踏上征服美女,雄霸江山的英雄之路。进入《三国记》首服【江山美人】注册的新玩家将获得豪放大礼,助您在雄霸江山抱得美人归的道路上更为顺畅!


点击访问三国记官方网站
离线tomsky
只看该作者 6楼 发表于: 2011-04-17
我刚刚写的算法,供参考:

//******************************************************************************
// Function        : vStatDirSizeEx
// Description     : 统计目录的大小,非递归算法
// Input           : const QString & sDirPath
// Input           : qint64 & iSize
// Output          :
// Return          : void
// Access          : public
//
// History         :
// 1 Date          : 2011-04-16
//   Author        : tomsky
//   Modification  : Created file
//******************************************************************************
void vStatDirSizeEx(const QString &sDirPath, qint64 &iSize)
{
    iSize = 0;
    QDir o_dir(sDirPath);
    if (!o_dir.exists())
    {
        return;
    }
    
    QStringList slst_dir_path;
    slst_dir_path << sDirPath;
    while (slst_dir_path.isEmpty() == false)
    {
        o_dir.setPath(slst_dir_path[0]);
        o_dir.setFilter(QDir::Dirs | QDir::Files);
        o_dir.setSorting(QDir::DirsFirst);
        slst_dir_path.removeFirst();
        
        foreach (QFileInfo o_file_info, o_dir.entryInfoList())
        {
            if (o_file_info.fileName() == "." || o_file_info.fileName() == "..")
            {
                continue;
            }

            iSize += o_file_info.size();
            if (o_file_info.isDir())
            {
                slst_dir_path << o_file_info.filePath();
            }
        }
    }

    return;
}
快速回复
限100 字节
 
上一个 下一个