5 Ağustos 2019 Pazartesi

opendir ve readdir İle Dizin Dolaşma

Giriş
Şu satırları dahil ederiz.
#include <sys/types.h>
#include <dirent.h>
opendir metodu
Metodun açıklaması şöyle.
The opendir() function opens a directory stream corresponding to the directory name, and returns a pointer to the directory stream.
The opendir() and fdopendir() functions return a pointer to the directory stream. On error, NULL is returned, and errno is set appropriately.
Örnek
opendir ile dizini açmak için şöyle yaparız.
DIR* directory = opendir(".");
Metod sonucunun NULL'dan farklı olduğunu kontrol etmek için şöyle yaparız.
if (directory == NULL) {
  printf("Error\n");
  exit(2);
}
Örnek
Şöyle yaparız.
void walk (const string &path, function<void (const string &)> talk)
{
  if (auto dir = opendir (path.c_str ())) {
    while (auto f = readdir (dir)) {
      auto name = f->d_name;
      auto type = f->d_type;
      switch (type)
      {
        case DT_DIR: walk (path + name + "/", talk); break;
        case DT_REG: talk (path + name            ); break;
      }
    }
    closedir(dir);
  }
}
closedir metodu
Tüm openXXX metodlarında olduğu gibi açılan kaynağı kapatmak gerekir.
closedir (directory);
readdir metodu
Açıklaması şöyle.
readdir() returns the name of the subdirectories, not the path to get to them.
Açıklaması şöyle.
The readdir() function shall return a pointer to a structure representing the directory entry at the current position in the directory stream specified by the argument dirp, and position the directory stream at the next entry. It shall return a null pointer upon reaching the end of the directory stream. The structure dirent defined in the <dirent.h> header describes a directory entry.
Örnek
Tüm yolun ismini almak için şöyle yaparız.
while ((ent = readdir (directory)) != NULL) 
{
  std::string path = dir;
  path += ent->d_name;
  if (stat(path.c_str(), &dir_stat)== 0) {...}
}
Örnek
Şöyle yaparız.
struct dirent *dirent;
while ((dirent = readdir (dirp)) != NULL) {
  ...
}
Örnek
Şöyle yaparız
struct dirent* direntp = readdir(dirp);
while(direntp != NULL)
{
    // all your work here

    direntp = readdir(dirp);
}
Örnek
Dosyaları dolaşırken büyük ihtimalle şu sanal dizinleri atlamak isteriz. Şöyle yaparız.
if( (strcmp (direntp->d_name, ".")==0) || (strcmp(direntp->d_name, "..")==0) )
{
  continue;
}
dirent yapısı
Şu satırları dahil ederiz.
#include <sys/types.h>
#include <dirent.h>
readdir çağrısı bu yapıyı döner. 

d_name alanı
Nesnenin ismine d_name ile erişiriz. Nesneye olan tüm yolu vermez! Nesneyi okumak için şöyle yaparız
fopen (file->d_name, "r+"); 
Nesne hakkında bilgi almak için şöyle yaparız.
struct stat stat;
stat (direntp->d_name, &stat);
d_type alanı
Açıklaması şöyle
unsigned char       d_type;     /* Type of file; not supported
                                by all filesystem types */
DT_DIR,DT_REG (dosya) ,DT_UNKNOWN gibi değerler alabilir.

Dolaşılan nesnenin tipi d_type alanı ile bulunur. Örnekte nesne dizin ise pas geçiliyor.
if (direntp->d_type != DT_REG )
{
   continue;
}


Hiç yorum yok:

Yorum Gönder