Giriş
Dosya ekleme silme işlemi olursa bu işlemin iterator'e yansıyacağı garanti değil. Açıklaması şöyle
Eğer directory_iterator veya recursive_directory_iterator arasında dönüşüm yapabilmek istersek şöyle bir ara sınıf kullanarak şöyle yaparız.
Şöyle yaparız
Şöyle yaparız.
Dosya ekleme silme işlemi olursa bu işlemin iterator'e yansıyacağı garanti değil. Açıklaması şöyle
Iterator'ün hangi sırada ne döneceği belirsiz. Açıklaması şöyleIf a file is removed from or added to a directory after the construction of a directory_iterator for the directory, it is unspecified whether or not subsequent incrementing of the iterator will ever result in an iterator whose value is the removed or added directory entry.
StrategyThe order of the path entries returned by dereferencing successive increments of a directory_iterator is unspecified.
Eğer directory_iterator veya recursive_directory_iterator arasında dönüşüm yapabilmek istersek şöyle bir ara sınıf kullanarak şöyle yaparız.
struct directory_range
{
typedef bfs::directory_iterator iterator;
directory_range(bfs::path p) : m_p(p) {}
iterator begin() { return bfs::directory_iterator(m_p); }
iterator end() { return bfs::directory_iterator(); }
bfs::path m_p;
};
Kullanmak için şöyle yaparız.for (const auto &it : directory_range(folder)) {
if(expression){
std::cout << "\n :clean: removing file : " << it.path();
bfs::remove(it.path());
}
}
Constructor - pathŞöyle yaparız
const path dirPath = ...;
directory_iterator dirBegin (dirPath);
path metodu
path tipinden bir nesne döner. Şöyle yaparız.
path p = ...;
for (auto i = directory_iterator(p); i != directory_iterator(); i++) {
std::string s = i->path().filename().string();
}
Döngü İçinde Kullanmak - C++98
Şöyle yaparız.
Elimizde bir path olsunŞöyle yaparız.
directory_iterator dirEnd;
for (directory_iterator dirBegin (p); dirBegin != dirEnd; ++it)
{
std::cout << dirBegin->path().filename() << "\n";
}
Döngü İçinde Kullanmak - C++11path p = ...;
for(auto &e : boost::filesystem::directory_iterator(p)){
std::cout << e.path() << std::endl;
...
}
auto kullanmak istemezsek şöyle yaparız.for (directory_entry& e : directory_iterator(p)) {
std::cout << e.path() << std::endl;
}
Şu kod derlenmez.for(auto&& e : directory_iterator(p)) {...}
STL Algoritmaları İle Kullanmak
Iterator ile gelen path nesnelerini vector'e doldurmak için şöyle yaparız
vector<path> dirContents;
copy (dirBegin, dirEnd(),back_inserter (dirContents) );
Daha sonra vector şöyle kullanılır.
vector<path>::const_iterator it = dirContents.begin();
for (; it != dirContents.end(); ++it) {
if (is_regular_file(*it)) {
cout (it->string());
}
}
Hiç yorum yok:
Yorum Gönder