百度空间 | 百度首页 
 
查看文章
 
ftp搜索引擎的设计和实现:4.6 求各个文件夹的大小
2007-03-19 22:27

欢迎转载,但请注明出处,并给活力链接。谢谢

       上面的一节介绍了Mapping这个类。该类主要有两个作用,一是求出各个文件夹的大小,文件夹的大小定义为它所含有的各个文件的大小和文件夹的大小的总和。二是“快照”功能。关于快照,将放在第四部分介绍。这一节主要介绍怎样求得文件夹的大小。
        回顾一下《3.4 信息搜集模块细节》,在那一节中讲述了在attr文件中,如果是文件夹,则大小一项记为-1.如果是文件,大小记为实际的byte数。
而后,所有的attr文件的每一行(即各个站点的每一个文件的属性)都被读入一个Fileinformation数组。

        来看下面这个函数:
long long oneDirSize(const INDEXTYPE idx,Mapping& mp);

        其中idx是Fileinformation数组的索引。
        该函数首先判断idx对应的是文件还是文件夹。如果是文件,则直接返回该文件的大小。
        如果是文件夹,则判断它的size是否为-1.如果不是,说明它已经被计算过了,直接返回该大小。
        最后,如果是-1,则利用Mapping类的subDirFile函数得到该文件夹下的所有文件和文件夹对应于Fileinformation数组的索引,递归调用oneDirSize函数。实现如下:


static long long oneDirSize(const INDEXTYPE idx,Mapping& mp)
{
      long long totalsize=0;
      if (!mp.isDir(idx))  // not a dir
      {
          return mp.getSize(idx);
      }
     // This is a dir, but size has been calculated before
      else if((totalsize = mp.getSize(idx)) != -1)
      {
          return totalsize;
      }
     // This is a dir, but size has not been calculated
      else
      {
    totalsize=0;
         vector<int> subfileindex;
    mp.subDirFile(idx,subfileindex);
          int leng = subfileindex.size();
          for(int i=0;i<leng;i++)
          {
              totalsize+=oneDirSize(subfileindex[i],mp);
          }
          // change cur size
          mp.changeSize(idx,totalsize);
          return totalsize;
      }
}


        从该函数的实现可以看到,只需要计算最顶层的文件夹,在递归过程中它所含有的子文件夹的大小即被计算了。

        那么哪些是最顶层的文件夹呢?位于ftp根目录“/”下的文件夹就是。所以我们只需要计算那些位于ftp根目录“/”下的文件夹。
        在Fileinformation数组中判断哪些是根目录/下的文件夹很简单,只需要判断“所在路径在对应的path文件中的偏移”是否为0.因为/总是出现在path文件中的第一位。
        好了,来看下面的这个函数,该函数计算一个ftp站点所含文件(夹)的总大小。传入的参数ip表示站点名,startindex和endindex分别是该站点的所有文件(夹)在Fileinformation数组中的起始和终结索引。

long long calcdirsize(const char* ip, const INDEXTYPE startindex, const INDEXTYPE endindex)
{
     Mapping mp(ip, startindex, endindex, false);
      long long totalsize=0;
      for(INDEXTYPE i=startindex;i<=endindex && mp.getDiroffset(i)==0;++i)
      {
          totalsize+=oneDirSize(i,mp);
      }

      return totalsize;
}

        计算文件夹大小的代码是src/buildindex/calcdirsize.cpp 读者可自行查阅。


类别:ftp搜索引擎 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu