gpt4 book ai didi

c++ - 递归走目录问题

转载 作者:行者123 更新时间:2023-11-28 03:30:05 24 4
gpt4 key购买 nike

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

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.hQ_OUTOFLINE_TEMPLATE void QList<T>::free(QListData::Data *data)功能线qFree(data);

谁能找出我错过了什么?

提前致谢。

最佳答案

根据我最后的评论,这是我简化步行功能的建议(基于 this ):

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

关于c++ - 递归走目录问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12821541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com