簡體   English   中英

C++ 將目錄中的所有文件與::文件系統進行比較

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM