Chinaunix首页 | 论坛 | 博客
  • 博客访问: 374959
  • 博文数量: 73
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2469
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-16 23:51
个人简介

活泼开朗是我的特性。

文章分类
文章存档

2014年(27)

2013年(46)

分类: C/C++

2014-04-01 10:19:20

void ClickHandler::findFile( const QString & fullPathName, const int &doType )
{
    QDir dir(fullPathName);
    if (!dir.exists())
        return ;
    dir.setFilter(QDir::Dirs|QDir::Files);
    dir.setSorting(QDir::DirsFirst);
    QFileInfoList list = dir.entryInfoList();
    QStringList infolist = dir.entryList(QDir::Files | QDir::NoDotAndDotDot);
    int i = 0;
    do{
        QFileInfo fileInfo = list.at(i);
        if(fileInfo.fileName()=="." || fileInfo.fileName()=="..")
        {
            i++;
            continue;
        }
        bool bisDir = fileInfo.isDir();
        if(bisDir)
        {
            findFile(fileInfo.filePath(), doType);
        }
        else
        {
                                                                                     
            if (1 == doType)
            {
                doFindExe(dir, infolist);
            }
            else if (2 == doType)
            {
                doGetMd5(dir, infolist);
            }
            else if (3 == doType)
            {
                doGetFileTime(dir, infolist);
            }
            break;//这里一定要break退出while循环,因为infolist中的文件访问完之后,当前文件夹下已经没有任何文件了,这里是递归的返回
        }
        i++;
    }while(i < list.size());//这里是list.size(),也就是当前文件夹下的文件夹数和文件数的和再+2
}

今天在用这个递归去遍历文件的时候出现了死循环。原因是我将父目录的快捷方式放到了子目录里面,程序在18行判断当前文件是否是目录的时候将快捷方式错当成目录,这就使得程序无休止的调用findFile直到堆栈溢出,程序崩溃。因此我们在19行进行如下的判断:
1
    
if(!fileInfo.isSymLink() && bisDir)

首先要不为快捷方式,然后再判断是不是目录,才进行递归,否则当做文件进行处理。

这应该是QT的一个BUG

原因是在判断某文件是否是目录的时候
   
bool QFileInfo::isDir() const
{
    Q_D(const QFileInfo);
    if (d->isDefaultConstructed)
        return false;
    return d->getFileFlags(QAbstractFileEngine::DirectoryType);
}

QAbstractFileEngine::DirectoryType 常量,值为0x4000,该文件是一个目录。

而在判断是否是快捷方式的时候

bool QFileInfo::isSymLink() const
{
    Q_D(const QFileInfo);
    if (d->isDefaultConstructed)
        return false;
    return d->getFileFlags(QAbstractFileEngine::LinkType);
}

QAbstractFileEngine::LinkType 常量,值为0x1000,该文件时对其他文件或链接所建立的链接

也就是快捷方式。明显这里是存在问题的。
阅读(3925) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~