我遍歷一個目錄,當一個項目符合一些條件時,我將其刪除。我可以在循環內安全地完成它,還是我必須將路徑保存在數組中,然後再刪除?我在boost::filesystem docs找不到相關信息。boost :: filesystem :: directory_iterator是否被刪除失效?
2
A
回答
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++;
}
}
}
相關問題
- 1. boost :: filesystem :: directory_iterator copy-ctor implictly deleted
- 2. 刪除依賴boost :: filesystem :: current_path()
- 3. 如何將boost :: filesystem :: directory_iterator轉換爲const char *
- 4. boost :: filesystem中的錯誤?
- 5. 如何檢查路徑在boost :: filesystem中是否有效?
- 6. C++:boost/filesystem:一些問題
- 7. 錯誤:使用刪除功能的boost :: filesystem3 :: directory_iterator
- 8. boost :: filesystem normalize filename
- 9. 在boost :: filesystem :: path中使用boost :: algorithm
- 10. 如何測試boost共享內存對象是否被刪除?
- 11. 在Boost Filesystem中過濾文件夾
- 12. boost :: filesystem :: path :: imbue失敗,默認std :: locale()
- 13. boost :: filesystem :: exists崩潰
- 14. 非確定性執行boost文件系統directory_iterator
- 15. boost :: filesystem添加引號?
- 16. 什麼是C++ 17等效於boost :: filesystem :: unique_path()?
- 17. Boost Filesystem - 枚舉設備?
- 18. Max_element與升壓directory_iterator
- 19. MySQL - 當表被刪除時,索引是否被刪除?
- 20. boost :: filesystem :: remove_all(path)是如何工作的?
- 21. 刪除空白分區。索引是否被標記爲無效?
- 22. Boost Filesystem編譯錯誤
- 23. Boost函數:boost :: filesystem :: file_size錯誤
- 24. flex 4:刪除元素是否也會導致元素失效?
- 25. boost :: filesystem :: last_write_time在哪裏?
- 26. Boost :: FileSystem鏈接問題
- 27. 追加到boost :: filesystem :: path
- 28. boost :: filesystem :: path operator/c2296 error
- 29. boost :: filesystem :: path.parent_path()和空格
- 30. 刪除cookie到期失效