Почему rmdir удаляет папку после выхода из программы? (Используя Dev C++ в Win7)


Я пытаюсь написать функцию с именем myremoved. Я хочу, чтобы он удалил непустую папку.
Но теперь у меня проблема, когда я использую функцию (код ниже) для удаления всех файлов и папки, «rmdir» говорит, что папка удалена, но когда я открываю Проводник Windows. Я видел, что папки, которые были удалены, все еще существуют (я пытаюсь получить доступ, но мне отказывают).

Это код функции "myremove":

int myremove(char *dirname){
    /*
      myremove(Folder name):Remove all files and folders in that. 
    */
    DIR  *folder;  
    struct _finddata_t c_file; 
    char str[256]; 
    long hasfile; 
    int a,result=0;

    _chdir(dirname); 
    hasfile =_findfirst("*",&c_file);
    if(hasfile!=-1){
        do{
            str[0]='\0';
            strcat(str,c_file.name);
            if((strcmp(str,".")!=0)&&(strcmp(str,"..")!=0)) {
                //Is it a folder or not 
                if ((folder = opendir(c_file.name)) == NULL)    {         
                    //Not a folder,using remove to delete it
                    if((a=remove(c_file.name))==0){
                        printf("Remove: %s OK.\n",c_file.name);
                }else{
                        result=-1;
                        printf("Remove: %s Failed.\n",c_file.name);
                    }       
                }else{
                    closedir(folder);
                    if((a=myremove(c_file.name))!=0){result=-1;}
                }
            }
        }while( _findnext( hasfile, &c_file )==0 );
    }
    _chdir("..");
    if ((folder = opendir(dirname)) != NULL){
        if((a=rmdir(dirname))!=0){
            result=-1;
        printf("Remove: %s Failed.\n",c_file.name);
        }else{
            printf("Remove: %s OK.\n",c_file.name);
        }
    }
    return result;
}

int main()
{
    char dirname[256],ch;
    printf("Please enter the folder name which you want to remove:");
    gets(dirname);
    if (strlen(dirname)!=0){
        printf("Notice:It will remove %s folder and all things in this folder,sure to continue[Y/N]?",dirname);
        scanf("%c",&ch);
        if(ch=='Y'){
            if (myremove(dirname)==0){
                printf("Folder %s Removed.\n",dirname);
            }else{
                if (rmdir(dirname)==0){
                    printf("Folder %s Removed.\n",dirname);
                }else{
                    printf("Folder %s couldn't be removed.\n",dirname);
                }

            }
        }else if (ch=='N'){
            printf("User cancel, program will exit.\n");    
        }
}else{
        printf("Nothing input,program will exit.\n");
    }
    system("pause");
    return 0;
}

person UnciaX    schedule 10.05.2014    source источник
comment
Не совсем отвечая на ваш вопрос, но действительно ли нужен второй вызов opendir? Я думаю, что это ненужно. Кроме того, если вы удалите его, это может решить вашу проблему.   -  person anatolyg    schedule 10.05.2014
comment
Я просто пытаюсь, но все равно не получается.   -  person UnciaX    schedule 10.05.2014
comment
Кажется, у вас есть утечка ресурсов в вашей ветке if ((folder = opendir(c_file.name)) == NULL) . В истинной ветке вы никогда не закрываете каталог, открытый с помощью opendir. Кроме того, оператор if не является хорошим способом узнать, является ли файл каталогом или нет. opendir потерпит неудачу по многим причинам, неудача из-за того, что имя файла, которое вы ему даете, на самом деле является каталогом, - это только одна возможность   -  person Brandin    schedule 10.05.2014
comment
Итак, мне нужно добавить оператор в истинную ветку, чтобы избежать того, что это действительно папка?   -  person UnciaX    schedule 11.05.2014


Ответы (1)


Что ж, я решил эту проблему сам.
Потому что я использую _findfirst и _findnext, но забыл использовать _findclose.
Поэтому папка заблокирована до конца программы.
Спасибо помогите.

#include <stdio.h>
#include <string.h>
#include <dirent.h>


int myremove(char *dirname){
    DIR  *folder; 
    struct _finddata_t c_file; 
    char str[256];
    long hasfile; 
    int a,result=0;

    _chdir(dirname);
    hasfile =_findfirst("*",&c_file);
    if(hasfile!=-1){
        do{
            str[0]='\0';
            strcat(str,c_file.name);
            if((strcmp(str,".")!=0)&&(strcmp(str,"..")!=0)) { 
                if ((folder = opendir(c_file.name)) == NULL)    {         
                    if((a=remove(c_file.name))==0){
                        printf("Remove: %s OK.\n",c_file.name);
                    }else{
                        result=-1;
                        printf("Remove: %s Failed.\n",c_file.name);
                    }       
                }else{
                    closedir(folder);
                    if((a=myremove(c_file.name))!=0){result=-1;}
                }
            }
        }while( _findnext( hasfile, &c_file )==0 );
        _findclose(hasfile);
    } 
    _chdir("..");
    if((a=rmdir(dirname))!=0){
        result=-1;
        printf("Remove: %s Failed.\n",dirname);
    }else{
        printf("Remove: %s OK.\n",dirname);
    }
    return result;
}

int main( int argc, char *argv[])
{
    char dirname[256],cmmd[20],ch;
    printf("Please enter folder name which you want to remove:");
    gets(dirname);
    if (strlen(dirname)!=0){
        printf("Notice:Now start to %s delete action, sure to continue[Y/N]?",dirname);
        scanf("%c",&ch);
        if(ch=='Y'){
            if (myremove(dirname)==0){
                printf("Folder %s Removed.\n",dirname);
            }else{
                printf("Folder %s Remove failed.\n",dirname);           
            }
        }else if (ch=='N'){
            printf("User cancel, program will exit...\n");  
        }
    }else{
        printf("Input empty, program will exit...\n");
    }
    system("pause");
    return 0;
}
person UnciaX    schedule 12.05.2014