Last active
October 26, 2015 06:27
-
-
Save huseyin/425efeca2a25cb40a33e to your computer and use it in GitHub Desktop.
Bir C denemesi
This file contains hidden or 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
/* | |
* Copyright (C) 2015 - Hüseyin Tekinaslan <[email protected]> | |
* | |
* You should have received a copy of the GNU General Public License | |
* along with this scripts. | |
* Ondokuz Mayis University, Samsun 02092015, TURKEY. | |
*/ | |
#ifndef H_KSTAT_ | |
#define H_KSTAT_ | |
#include <stdlib.h> | |
#include <stdlib.h> | |
#include <unistd.h> | |
#include <dirent.h> | |
#include <sys/stat.h> | |
#define K_OK 1 | |
#define K_FAIL -1 | |
static void childs(char*, char***); | |
static int K_DIREXIST(char*); | |
struct kstat { | |
char** kd_childs; | |
char* kd_dname; | |
int kd_fsize; | |
int kd_exist; | |
}; | |
struct kstat* kd_stat(char* dir) | |
{ | |
struct kstat* list_dir = malloc(sizeof(struct kstat)); | |
struct stat st; | |
char** buffers; | |
/* Dizin fiziksel olarak bir adres belirtiyorsa, yani gerçekte | |
* var ise içeri gir. | |
*/ | |
if (K_DIREXIST(dir) == K_OK) { | |
list_dir->kd_dname = dir; | |
list_dir->kd_exist = 1; | |
/* Alt dizin ve dosyaları al buffer isimli double pointer | |
* değişkende tut. | |
*/ | |
childs(dir, &buffers); | |
list_dir->kd_childs = buffers; | |
if (stat(dir, &st) == 0) | |
list_dir->kd_fsize = st.st_size; | |
} else { | |
/* Dizin fiziksel olarak yok ise değerleri boş değerler ile değştir. | |
* Default'a düşür. | |
*/ | |
list_dir->kd_dname = NULL; | |
list_dir->kd_childs = NULL; | |
list_dir->kd_exist = 0; | |
list_dir->kd_fsize = 0; | |
} | |
return list_dir; | |
} | |
/* Dosya fiziksel olarak erişilebilir ise K_OK değerini döndür. Değil ise | |
* K_FAULT değerini döndür. | |
*/ | |
static int K_DIREXIST(char* dir) | |
{ | |
if (access(dir, F_OK ) != -1 ) | |
return K_OK; | |
else | |
return K_FAIL; | |
} | |
static void childs(char* path, char*** l_dir) | |
{ | |
unsigned short int l_size; | |
DIR* dir_p = opendir(path); | |
struct dirent* rd_dir = readdir(dir_p); | |
/* Bir alt dizindeki dosya ve klasörlerin sayısını hesapla. Bir aşağıda ** pointer | |
* tipli değişkene ekleyebilmek için sayıların bilinmesi önemli. | |
*/ | |
for (l_size=0; rd_dir; l_size++) | |
rd_dir = readdir(dir_p); | |
// bellekte toplam uzunluktaki değerler kadar yer aç. | |
*l_dir = malloc(l_size * sizeof(char*)); | |
rewinddir(dir_p); | |
rd_dir = readdir(dir_p); | |
// Alt dizindeki dosya ve klasörleri ** pointerlı değişkenin içerisine ekle. | |
for (l_size=0; rd_dir; l_size++) { | |
(*l_dir)[l_size] = strdup(rd_dir->d_name); | |
rd_dir = readdir(dir_p); | |
} | |
closedir(dir_p); // Kapat. | |
} | |
#endif // H_KSTAT_ |
This file contains hidden or 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
/* | |
* example | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include "kstat.h" | |
int main(void) | |
{ | |
struct kstat* ptr = kd_stat("/"); | |
char** ch = ptr->kd_childs; | |
size_t i; | |
printf("Directory: %s\n", ptr->kd_dname); | |
printf("Exist: %d\n", ptr->kd_exist); | |
printf("Size: %d\n", ptr->kd_fsize); | |
printf("Childs: \n"); | |
for (i=0; i < 25; i++) | |
printf("\t%d) %s\n", i+1, ch[i]); | |
free(ch); | |
return EXIT_SUCCESS; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Beklenen çıktı: