• 5211阅读
  • 8回复

史上最奇怪的程序bug:递归地删除一个文件夹及其下面的所有文件。 [复制链接]

上一主题 下一主题
离线ch19860304
 
只看楼主 倒序阅读 楼主  发表于: 2009-06-17
我写了个程序,来递归地删除某个文件夹,及其下的所有文件夹及文件。有以下四种情况:
1、父文件夹下只有若干子文件。能正常删除。
2、父文件夹下有一个子文件夹。能正常删除。
3、父文件夹下有一个子文件夹和多个文件。只有删除多个子文件,不能删除子文件夹和父文件夹。
4、父文件夹下有多子个文件夹。只有删除一个子文件夹,其余子文件夹和父文件夹不能删除。
程序如下:
model = new QDirModel ;
list = new QListView;
list->setModel(model);
void Imagewindow::rmfile(QModelIndex &index)
{
    QModelIndex child_index;
    int column, row, i, j;    
    model->setReadOnly(false);
    if(!model->isDir(index))
    {
        model->remove (index);
    }
    else
    {
        if(model->hasChildren(index))
        {
            qDebug("has children!");
            column = model->columnCount(index);
            row = model->rowCount(index);
            qDebug("column = %d, row = %d!",column, row);
            for(i = 0; i <column ; i++)
                for(j = 0; j <row ; j++)
                {
                    child_index = model->index(j,i,index);
                    if(child_index.isValid())
                    {
                        filename  = model->fileName(child_index);
                        qDebug("name = %s!",qPrintable(filename));
                        rmfile(child_index) ;
                    }
                }
        }
        model->rmdir (index);
    }
}
离线duduqq

只看该作者 1楼 发表于: 2009-06-18
如果是在LINUX下可以用LINUX删除文件夹的命令试试啊
离线ch19860304
只看该作者 2楼 发表于: 2009-06-18
什么意思?linux下删除文件夹的命令:rm -rf you_dir ,这个命令可以出现在C++的程序里?
只看该作者 3楼 发表于: 2009-06-18
史上最莫名递归,你都打算做递归了,你还去吧row和column都去遍历一遍干嘛,把儿子拿去递归不就好了,你找孙子干嘛
离线ch19860304
只看该作者 4楼 发表于: 2009-06-18
你的意思是:row是儿子,column是孙子?
改成:
for(j = 0; j <row ; j++)
{
    child_index = index.child(j,0) ;
}
改了,但有段错误呀!
离线ch19860304
只看该作者 5楼 发表于: 2009-06-18
那你的解决方案是?
只看该作者 6楼 发表于: 2009-06-18
引用第4楼ch19860304于2009-06-18 23:19发表的  :
你的意思是:row是儿子,column是孙子?
改成:
for(j = 0; j <row ; j++)
{
    child_index = index.child(j,0) ;
.......

你非要j++就不能j--倒数啊,你第一个儿子删没了,第二个就变第一个了,数着数着当然超界了
离线ch19860304
只看该作者 7楼 发表于: 2009-06-20
我还有个问题,就是关于QmodelIndex的,如果说第一个儿子的QmodelIndex值是index1,而第二个儿子是index2,…..,以此类推,第n个儿子是indexn。在这诸多儿子被删除的过程中,它们的QmodelIndex对应值也会跟着变化吗?
离线xjcook

只看该作者 8楼 发表于: 2009-06-21
引用第6楼都市无名者于2009-06-18 23:20发表的  :
你非要j++就不能j--倒数啊,你第一个儿子删没了,第二个就变第一个了,数着数着当然超界了


此为正解。
删了前面的,后面的顺序会变,序号会变。
快速回复
限100 字节
 
上一个 下一个