0

ディレクトリを再帰的にたどってその内容を変更しようとしています。その変更は、すべてのファイルとサブディレクトリのファイルに対して行う必要があります。

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関数:

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 なりqlist.hますQ_OUTOFLINE_TEMPLATE void QList<T>::free(QListData::Data *data)qFree(data);

誰かが私が見逃しているものを見つけることができますか?

前もって感謝します。

4

1 に答える 1

2

私の最後のコメントによると、これは歩行機能を簡素化するための私の提案です(これに基づいて

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() に渡すことで、より一般的なものにすることもできます。適用する必要がある他のタイプの処理に再利用できるようにします。

また、コードのテストに熱心な場合は、以前の提案が単体テスト可能ではないことに気付くかもしれません。メソッドを簡単にテストできるようにするには、依存しない入力と出力が必要であり、テストで出力をチェックします。期待値に対して。

したがって、指定されたディレクトリツリーから収集されたすべてのファイルのリストを返すバージョンは次のとおりです。

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;
}

そして、ファイルをループして暗号化する 3 番目の方法を追加できます。

void encryptDirectoryTree( const QString& dirname )
{
     QStringList filesInDir = walk( dirname );
     foreach( const QString& filePath, filesInDir ) {
        encrypt( filePath );
     }
}
于 2012-10-13T06:25:51.070 に答える