19 Ocak 2017 Perşembe

filesystem directory_iterator Sınıfı

Giriş
Dosya ekleme silme işlemi olursa bu işlemin iterator'e yansıyacağı garanti değil. Açıklaması şöyle
If 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.
Iterator'ün hangi sırada ne döneceği belirsiz. Açıklaması şöyle
The order of the path entries returned by dereferencing successive increments of a directory_iterator is unspecified.
Strategy
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.
directory_iterator dirEnd;

for (directory_iterator dirBegin (p); dirBegin != dirEnd; ++it)
{
  std::cout << dirBegin->path().filename() << "\n";
}
Döngü İçinde Kullanmak - C++11
Elimizde bir path olsun
path p = ...;
Şöyle yaparız.
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