Skip to content

Instantly share code, notes, and snippets.

@semihozkoroglu
Created December 11, 2010 22:12
Show Gist options
  • Save semihozkoroglu/737691 to your computer and use it in GitHub Desktop.
Save semihozkoroglu/737691 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#define MAX_PATH_SIZE 1024
void DirWalk(const char *path, void (*Proc) (const char *))//fonksiyon işaretçileriyle dışardaki bir fonksiyona yönlendirez.
{
char fname[MAX_PATH_SIZE];
struct dirent *de;//dirent yapısında d_ino ve d_name yapıları bulunmaktadır.
struct stat status;
DIR *dir;
if ((dir = opendir(path)) == NULL) {
perror("opendir");
return;
}
while ((de = readdir(dir)) != NULL) {
sprintf(fname, "%s/%s", path, de->d_name);
Proc(fname);
if (strcmp(de->d_name, ".") != 0 && strcmp(de->d_name, "..") != 0) { //"." bulundugu dizin,".." üst dizini gösterdiğinden programın tekrardan bu dizinlere girmesini engelliyor.
if (stat(fname, &status) == -1) { //stat fonksiyonu başarısızlık durumunda -1 döner.Ve status dosya bilgilerini tutar(örnek:dosya erişimindeki izin bilgileri gibi).Ancak burada kullanılmasının amacı her gelişinde değişen fname ile birlikte status durumunuda set etmek ve aşagıda S_ISDIR fonksiyonunda kullanmak.
perror("stat");//perror fonksiyonunu çıktısı "stat:burası errno değişkenine karşılık gelen mesaj metni" şeklinde olur.errno değişkenine mesaj metni stat fonksiyonu tarafından set edilir.
break;
}
if (S_ISDIR(status.st_mode)) //Status değişkeninde dosya bilgileri tutuluyordu burada dosyanın dizin mi ? kontrolünü yapar evetse özyineli yapıya dönüşür.
DirWalk(fname, Proc);//proc fonksiyon göstericisine ana fonksiyonda Disp'i atamıştık zaten.
}
}
closedir(dir);
}
void Disp(const char *name)
{
puts(name);
}
int main(int argc, char *argv[])
{
char fname[MAX_PATH_SIZE];
char *plast;
// size_t size;
if (argc != 2) {
printf("Usage: dirtree <path>\n");
exit(1);
}
strcpy(fname, argv[1]);
plast = strchr(fname, '\0') - 1;//strchr belirtilen karakteri ilk bulduğunda adresini dönmektedir.
if (*plast == '/')//gelen path'in sonundaki "/" ifadesini kaldırıyoruz.
*plast = '\0';
DirWalk(fname, Disp);//path'i ve puts çıktısını üreten fonksiyonumuzu işaret ediyoruz.
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment