首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归遍历目录问题

递归遍历目录问题
EN

Stack Overflow用户
提问于 2012-10-10 22:15:57
回答 1查看 915关注 0票数 0

我正在尝试递归遍历一个目录并修改它的内容,这个修改应该对子目录的所有文件和文件进行。

代码语言:javascript
复制
void EncryptMountedFolder(QString DirPath)
{
        QStringList listFile;
        QStringList listDir;
        int r=0;
    if(WalkDir(DirPath,listFile,listDir))
     {

        foreach (QString filePath, listFile)
        {
        //modif of file with filePath as path
        }

        foreach(QString subdirPath, listDir)
        {
            EncryptMountedFolder(subdirPath);
        }

      }
      else qDebug()<<"can not find "<<DirPath<<"or it is not folder path ";

}

WalkDir函数:

代码语言:javascript
复制
bool WalkDir(QString DirPath, QStringList &FList, QStringList &DList)
{
    QString p=QDir::fromNativeSeparators(DirPath);
    QDir dir( p );
    if(dir.exists())
    {           
          dir.setFilter( QDir::Dirs | QDir::Files | QDir::NoSymLinks );
          const QFileInfoList fileinfolist = dir.entryInfoList();

          foreach(const QFileInfo& fi,fileinfolist)
              if(fi.baseName() != "")
              {
                if( fi.isDir() && fi.isReadable() )
                 DList=DList << fi.absoluteFilePath() ;
                 else
                    FList= FList<< fi.absoluteFilePath();
              }              
        return true;
    }
    else
        {    qDebug()<<"not valid dir path or doesn't exist"<<DirPath ;
             return false;
         }    
}

所有子目录下的文件都按我想要的方式进行了修改,但是它崩溃了,我得到:Critical error detected c0000374将我指向Q_OUTOFLINE_TEMPLATE void QList<T>::free(QListData::Data *data)函数行qFree(data);中的qlist.h

有人知道我错过了什么吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-13 14:25:51

根据我的上一条评论,这是我的建议,简化步行函数(基于this):

代码语言:javascript
复制
void walk( const QString& dirname )
{
  QDir dir( dirname );
  dir.setFilter( QDir::Dirs | QDir::Files | QDir::NoSymLinks );

  const QFileInfoList fileinfolist = dir.entryInfoList();
  foreach( const QFileInfo& fi,fileinfolist ) {
    if( fi.baseName() == "." || fi.baseName() == ".."  || fi.baseName() == "" ) {
      continue;
    }
    if( fi.isDir() && fi.isReadable() ) {
      // This is the conditional for recursion
      walk( fi.absoluteFilePath() );
    }
    else {
      // This is where you might call your encrypting function
      qDebug() << "Encrypting file: " << fi.absoluteFilePath();
      encrypt( fi.absoluteFilePath() );
    }
  }
}

您还可以通过将加密函数作为回调传递给walk()来使其更通用。以便您可以将其重用于您可能需要应用的其他类型的处理。

此外,如果您热衷于测试代码,您可能会注意到我之前的建议是不可单元测试的:为了使方法易于测试,它应该具有非依赖的输入和输出,并且您的测试将根据期望值检查输出。

因此,下面的版本返回从给定目录树收集的所有文件的列表:

代码语言:javascript
复制
QStringList walk( const QString& dirname )
{
  QDir dir( dirname );
  dir.setFilter( QDir::Dirs | QDir::Files | QDir::NoSymLinks );

  const QFileInfoList fileinfolist = dir.entryInfoList();
  QStringList collectedFileList;
  foreach( const QFileInfo& fi,fileinfolist ) {

    if( fi.baseName() == "." || fi.baseName() == ".."  || fi.baseName() == "" ) {
      continue;
    }

    if( fi.isDir() && fi.isReadable() ) {
      collectedFileList << walk( fi.absoluteFilePath() );
    }
    else {
      collectedFileList << fi.absoluteFilePath();
    }
  }
  return collectedFileList;
}

现在您可以添加第三种方法来循环遍历文件并对其进行加密:

代码语言:javascript
复制
void encryptDirectoryTree( const QString& dirname )
{
     QStringList filesInDir = walk( dirname );
     foreach( const QString& filePath, filesInDir ) {
        encrypt( filePath );
     }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12821541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档