遍历目录递归问题
Walk Directory recursively issue
我正在尝试递归地浏览目录并修改其内容,应该对所有文件和子目录的文件进行修改。
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
指出我在Q_OUTOFLINE_TEMPLATE void QList<T>::free(QListData::Data *data)
功能行中qlist.h
qFree(data);
谁能发现我错过了什么?
提前谢谢。
根据我的最后一条评论,这是我简化步行功能的建议(基于此):
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++ 中的以下问题设计递归算法
- 棘手的按值传递和按引用递归问题传递
- C++删除/(递归)对象销毁问题
- 返回不停止函数,递归函数问题?(编程练习,动态规划,Levenshtein 回溯)
- 变分模板递归构造函数问题
- 跟踪递归函数时出现问题
- 我遇到了有关递归的堆栈问题
- 这个简单的 C++ 递归函数来反转字符串有什么问题?
- 递归回文问题的时间复杂度,C++
- 递归 Boost.Spirit 解析的问题
- 具有编译问题的简单(递归)可变参数模板"accumulate_for"函数
- 可变参数模板中递归模板函数的终止问题
- 递归布尔函数的问题
- 我的编辑距离递归代码中的字符类型有问题
- 优化递归问题以计算超级数字
- 我的链接列表反向递归方法的代码的问题是什么?
- 问题 - 递归函数以返回文本文件排列
- nqueens问题的C 递归解决方案无法正常工作
- 递归结构的向量有内存问题