2013-06-11 61 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