// traverse a directory tree applying a function when a file is found void process(char *root) { int numOfFiles = 0; que_t nameq; char dname[MAXLENGTH]; char cname[MAXLENGTH]; char prefix[MAXLENGTH]; struct dirent *dp; DIR *dirp; initq(&nameq); enqueue(root,&nameq); while (true != queue_empty(nameq)) { peek_front(dname,nameq); dequeue(&nameq); dirp = opendir(dname); if (dirp != NULL) { // it is a directory printf("directory : %s\n",dname); strncpy(prefix, dname, MAXLENGTH); strncat(prefix,"/", MAXLENGTH); for (dp = readdir(dirp); NULL != dp; dp = readdir(dirp)) { if ((strcmp(dp->d_name,"..") != 0) && (strcmp(dp->d_name,".") != 0)) { // prevent from infinite loop strncpy(cname, prefix, MAXLENGTH); // concatenate the prefix strncat(cname, dp->d_name, MAXLENGTH); enqueue(cname,&nameq); } } closedir (dirp); } else { // test if it is a regular file and not a device or link -- TO-DO // if this is a regular file, then process it -- TO-DO printf(" processing file: %s\n", dname); numOfFiles++; } } // while printf(" a total of %d files were counted\n",numOfFiles); }
// traverse a directory tree applying a function when a file is found void process(char *root) { int numOfFiles = 0; que_t nameq; char dname[MAXLENGTH]; char cname[MAXLENGTH]; char prefix[MAXLENGTH]; struct dirent *dp; DIR *dirp; struct stat file_info; unsigned int fd; initq(&nameq); enqueue(root,&nameq); while (true != queue_empty(nameq)) { peek_front(dname,nameq); dequeue(&nameq); dirp = opendir(dname); if (dirp != NULL) { // it is a directory printf("directory : %s\n",dname); strncpy(prefix, dname, MAXLENGTH); strncat(prefix,"/", MAXLENGTH); for (dp = readdir(dirp); NULL != dp; dp = readdir(dirp)) { if ((strcmp(dp->d_name,"..") != 0) && (strcmp(dp->d_name,".") != 0)) { // prevent from infinite loop strncpy(cname, prefix, MAXLENGTH); // concatenate the prefix strncat(cname, dp->d_name, MAXLENGTH); enqueue(cname,&nameq); } } closedir (dirp); } else { // test if it is a regular file and not a device or link -- TO-DO fd = open(dname, O_RDONLY); if (-1 == fd) { perror("Failed to open read only file - "); exit(-1); } if(fstat(fd, &file_info)==0){ // if this is a regular file, then process it -- TO-DO if(S_ISREG(file_info.st_mode)){ printf(" processing file: %s\n", dname); numOfFiles++; } } close(fd); } } // while printf(" a total of %d files were counted\n",numOfFiles); }
int queue_peek(node* list) { return peek_front(list); }