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) |