2012-11-22 59 views

回答

6

引述連接到docs of boost::filesystem::directory_iterator記的第一部分(重點是我自己):

程序執行目錄迭代可能希望測試,如果通過取消引用一個目錄迭代器獲得的路徑確實存在。它可能是一個不存在的文件的符號鏈接。 爲了刪除和重命名條目,可能希望避免以下符號鏈接,遞歸地遍歷目錄樹的程序。

我很清楚,爲刪除文件而迭代目錄是官方支持的用例,因此不會使迭代器無效。此外,引用該說明的第二部分:

如果一個文件被刪除或增加到爲目錄directory_iterator後建一個目錄,它是不確定的迭代與否後續增量將永遠產生一個迭代器,其值是被刪除或添加的目錄條目。參見ISO/IEC 9945 readdir_r()。

這是一個非常具體的聲明,說明在迭代目錄時是否會出現已刪除的文件。我再次明白,迭代過程本身在任何情況下都是有效的。

請注意,ISO/IEC 9945有類似的措辭。

1

在Windows上,它是真的,但我發現一個Ubuntu,迭代器在刪除後在其上被取消失效,因此下一次訪問會引發異常。

所以最後我用這樣的:

recursive_directory_iterator end; 
    for (recursive_directory_iterator itr(folderPath); itr != end;) 
    { 
     path filePath = *itr++; 
     if (is_regular_file(filePath) && filePath.string().find(filter) != std::string::npos) 
     { 
      if (remove(filePath)) 
      { 
       removedFilesCounter++; 
      } 
     } 
    } 
相關問題