2013-06-11 34 views
0

我想从我的命令行解释器中移除所有文件和子目录。当调用rmdir -s newFolder时,我调用一个函数removeAll,它遍历所有文件和子文件夹并删除所有文件。递归移除目录和文件的问题

例如,如果我想删除文件newFolder,我删除所有文件并进入newFolder1。我删除newFolder1中的所有文件并进入newFolder2并删除所有文件。所以现在我在newFolder 2中,newFolder,newFolder1和newFolder2都是空的。

我的问题是我如何递归备份并删除这3个空文件夹。我已经调试过几个小时,并且我只是没有得到它。谢谢

这是成功删除一个空文件夹的功能,否则会调用removeAll。

void MyShell::rmdir() { 
//Error Check 
if(argc != 3) { 
    printf("USAGE: rmdir [-s] <directory>\n");  
    return; 
} 
else if(stricmp(cwd, argv[2]) == 0){ 
    printf("Cannot remove the current working directory"); 
    return; 
} 
if(_rmdir(argv[2]) == 0) 
    return; 

removeAll(argv[2]); 

}

removeall过成功删除所有子文件夹

void removeAll(char *path) 
{ 
    _chdir(path); 

    _finddata_t data; 

    intptr_t handle = _findfirst("*", &data); 

    if(handle == -1) 
    { 
     return; 
    } 

    do 
    { 
     if (strcmp(data.name, ".") == 0 || strcmp(data.name, "..") == 0) 
     { 
      continue; 
     } 

     remove(data.name); 

     if(data.attrib & _A_SUBDIR) 
     { 
      removeAll(data.name); 
     } 

    } while(_findnext(handle, &data) != -1); 

    _findclose(handle); 
} 

我的想法递归备份并删除所有子文件夹中的所有文件的功能是调用一个方法,它从FindNext中打破后循环

void removeDirectory(char *path) 
{ 
    _finddata_t data; 

    intptr_t handle = _findfirst("*", &data); 

    if(handle == -1) 
    { 
     return; 
    } 

    do 
    { 
     if (strcmp(data.name, ".") == 0 || strcmp(data.name, "..") == 0) 
     { 
      continue; 
     } 


     if(data.attrib & _A_SUBDIR) 
     { 
      if(_rmdir(data.name) == 0) 
      { 
       _chdir(".."); 
       removeDirectory(path); 
      } 

     } 

    } while(_findnext(handle, &data) != -1); 

    _findclose(handle); 
} 
+1

我记得我在dos上的第一个递归目录删除,在第一个条目中找到'..'并爬上去删除所有东西。幸运的是它有另一个bug,所以我的HD在第一次测试中幸存下来。 –

回答

1

递归的整点是你不必须去“备份”。递归例程的每次迭代应该只处理它自己的级别,然后再次调用自己或突然出现。看起来你已经完成了。尝试这样的事情你removeall过例行:

void removeAll(char *path) 
{ 
    _chdir(path); 

    _finddata_t data; 

    intptr_t handle = _findfirst("*", &data); 

    if(handle == -1) 
    { 
     return; 
    } 

    while(_findnext(handle, &data) != -1) // changed from do..while to just while 
    { 
     if (strcmp(data.name, ".") == 0 || strcmp(data.name, "..") == 0) 
     { 
      continue; 
     } 

     if(data.attrib & _A_SUBDIR) 
     { 
      removeAll(data.name); 
      _rmdir(data.name); // <- moved this to here 
     } 
     else 
     { 
      remove(data.name); 
     } 
    } 

    _findclose(handle); 
} 
+0

我试过这个代码重新安排你刚才写的。再次,它正确删除我需要的所有文件,但不是我需要删除的文件夹。我很困惑 – Jeff

+0

我认为问题是当它进入最后的子文件夹,只有“。”和“..”它只是返回,但我需要它递归备份可以这么说(虽然我理解递归并不技术上递增备份,但交易在它自己的水平)我无法弄清楚这一点,太令人沮丧了! – Jeff

+0

有什么想法?仍然是调试,仍然没有解决:( – Jeff

1

假设remove()方法将删除空目录以及文件,你应该只需要重新排列码本:

do 
{ 
    if (strcmp(data.name, ".") == 0 || strcmp(data.name, "..") == 0) 
    { 
     continue; 
    } 

    if(data.attrib & _A_SUBDIR) 
    { 
     removeAll(data.name); 
    } 

    remove(data.name); 

} while(_findnext(handle, &data) != -1); 

基本上,您的递归函数应遵循此伪代码:

void deleteAll(path) 
{ 
    for each file in path 
    { 
     if file is folder 
     { 
      // empty the folder 
      deleteAll(file) 
     } 

     delete file // whether it is a now-empty folder or a file 
    } 
} 

这样一来,当你遇到一个文件夹,则立即进入,并删除其内容,然后返回到SCOP e的父文件夹,现在您可以将其删除,因为它是空的。

+0

删除不会删除文件夹,只会删除文件。我需要_rmdir来删除一个空目录 – Jeff