void callStat(char * name){ char help [512] = "./"; unsigned long subsize; DIR * subdir; struct stat statBuf; struct dirent *entPtr; stat(name, &statBuf); if(S_ISDIR(statBuf.st_mode)){ if(!strcmp(name, ".") ==0 && !strcmp(name, "..") ==0){ subsize = 0; subdir = opendir(name); subopen = 1; chdir(name); while ((entPtr = readdir(subdir))){ strcat(help, entPtr->d_name); callStat(help); } } if(!strcmp(name, ".") ==0 && !strcmp(name, "..") ==0){ if(subopen == 1){ printf("%lu\t./%s\n", subsize,name); }else{ printf("%lu\t.%s\n", subsize,name); } } }else{ size +=statBuf.st_size; } }
int main(int argc, char ** argv){ DIR *dirPtr; if(argc < 2){ perror("You must provide a directory!"); }else{ callStat(argv[1]); dirPtr = opendir (argv[1]); while ((entryPtr = readdir (dirPtr))){ callStat(entryPtr->d_name); } printf("%lu\n", size); closedir (dirPtr); } return 1; }
virtual int access(const String& path, int mode) { Variant ret = callStat(path); if (ret.isBoolean()) { assert(!ret.toBoolean()); return -1; } return 0; }
int access(const String& path, int /*mode*/) override { Variant ret = callStat(path); if (ret.isBoolean()) { assert(!ret.toBoolean()); return -1; } return 0; }
virtual int stat(CStrRef path, struct stat* buf) { Variant ret = callStat(path); if (ret.isBoolean()) { assert(!ret.toBoolean()); return -1; } CArrRef stat = ret.toArray(); buf->st_size = stat[s_size].asInt64Val(); buf->st_atime = stat[s_atime].asInt64Val(); buf->st_mtime = stat[s_mtime].asInt64Val(); buf->st_ctime = stat[s_ctime].asInt64Val(); return 0; }
int stat(const String& path, struct stat* buf) override { Variant ret = callStat(path); if (ret.isBoolean()) { assert(!ret.toBoolean()); return -1; } const Array& stat = ret.toArray(); buf->st_size = stat[s_size].asInt64Val(); buf->st_atime = stat[s_atime].asInt64Val(); buf->st_mtime = stat[s_mtime].asInt64Val(); buf->st_ctime = stat[s_ctime].asInt64Val(); buf->st_mode = stat[s_mode].asInt64Val(); return 0; }