Created
December 11, 2010 22:12
-
-
Save semihozkoroglu/737691 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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