What is the correct way to use the stat() function to test if a DIRENT is a directory or a file?

c, directory-structure, function

Solution

Yes, that's correct. But since you never change into the directory, you will not find it.

Consider the following directory hierarchy:

 a
 |
 +- b
 |  |
 |  +- c
 ...

Your code will scan its current directory, and find "a". It will determine that it is a directory, and call itself recursively, and open "a" for reading. This works. That scan will find a directory called "b", but trying to open it using the entry name only will fail, since the path is now "a/b".

I recommend changing into the directory (with `chdir()`) before opening it. That means you can just `opendir(".")`. Store the old path, and `chdir()` out again when recursing that level is done (not before doing a recursive call to go deeper).

Problem

I'm having some trouble with the 'if(S_IFDIR(stbuf.st_mode))' line. Is this the correct way to test for a directory to recurse into? The function at the moment seems to do it right for 1 or 2 loops and then fails and segmentation faults. I've tried the following and probably more as the condition. ``` S_ISDIR(st_mode) ((st_mode & ST_IFMT) == S_IFDIR) S_IFDIR(stbuf.st_mode) ``` I've included the whole function because I'm concerned the problem might be elsewhere. ``` void getFolderContents(char *source, int temp){ struct stat stbuf; int isDir; dirPnt = opendir(source); if(dirPnt != NULL){ while(entry = readdir(dirPnt)){ char *c = entry->d_name; if(strcmp(entry->d_name, cwd) == 0 || strcmp(entry->d_name, parent) == 0){ } else{ stat(entry->d_name, &stbuf); printf("%i %i ", S_IFMT, stbuf.st_mode); if(S_IFDIR(stbuf.st_mode)){ //Test DIR or file printf("DIR: %s\n", entry->d_name); getFolderContents(entry->d_name, 0); } printf("FILE: %s\n", entry->d_name); } } closedir(dirPnt); } ```

Original source

Related problems