Walk Directory рекурсивно выдает

Я пытаюсь рекурсивно пройти каталог и изменить его содержимое, это изменение должно быть сделано для всех файлов и файлов подкаталогов.

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

Может кто-нибудь узнать, что я скучаю?

Заранее спасибо.

0

Решение

Согласно моему последнему комментарию, это мое предложение упростить функцию ходьбы (на основе этот):

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

И теперь вы можете добавить третий метод, чтобы перебирать файлы и шифровать их:

void encryptDirectoryTree( const QString& dirname )
{
QStringList filesInDir = walk( dirname );
foreach( const QString& filePath, filesInDir ) {
encrypt( filePath );
}
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]