[英]C++ comparing all files in a directory with ::filesystem
我正在嘗試比較目錄中的所有文件。
該目錄不斷從不同的線程中添加新文件。 雖然 directory_iterator 文檔說更改可能不會反映出來,所以我用一個外部循環解決了這個問題,當內部循環完成時再次嘗試:
void mergeFolder(int aFolderNum)
{
bool aPreviousMergesFinished = false;
while (!aPreviousMergesFinished)
{
filesystem::directory_iterator aEnd;
for (filesystem::directory_iterator aIterator1("data/temp/MERGEME/" + std::to_string(aFolderNum)),
aIterator2 = ++aIterator1;
aIterator2 != aEnd; ++aIterator1, ++aIterator2)
{
std::cout << "file 1: " << aIterator1->path() << std::endl;
std::cout << "file 2: " << aIterator2->path() << std::endl;
}
std::cout << "Finished inner loop" << std::endl;
aPreviousMergesFinished =
std::filesystem::is_empty("data/temp/MERGEME/" + std::to_string(aFolderNum));
}
}
但是,output如下:
...
文件 1:“data/temp/MERGEME/1\1_999”
文件 2:“data/temp/MERGEME/1\1_999”
文件 1:“data/temp/MERGEME/1\1_9991”
文件 2:“data/temp/MERGEME/1\1_9991”
文件 1:“data/temp/MERGEME/1\1_9993”
文件 2:“data/temp/MERGEME/1\1_9993”
文件 1: "data/temp/MERGEME/1\1_9995"
文件 2:“data/temp/MERGEME/1\1_9995”
文件 1:“data/temp/MERGEME/1\1_9997”
文件 2:“data/temp/MERGEME/1\1_9997”
文件 1:“data/temp/MERGEME/1\1_9999”
文件 2:“data/temp/MERGEME/1\1_9999”
完成內循環
如您所見,每個文件都在內循環中打印了兩次,但我幾乎可以肯定我已經正確地完成了內循環。 這里出了什么問題?
directory_iterator
只是一個輸入迭代器,而不是前向迭代器。 這意味着它僅在一次通過時保證正確的行為。
一旦您遞增directory_iterator
,任何引用先前 state 的副本都會失效。 使用它們會導致未定義的行為。
你在這里嘗試的是不可能的。 即使你正在嘗試的是允許的,你也只會迭代相鄰的對,而不是所有的對。
相反,從一個迭代器中讀入所有文件名並傳遞到一個容器中,然后用兩個循環遍歷該容器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.