I am iterating directories recursively with readdir
.
struct dirent
is documented here, and notes that d_type
can have different values including DT_LNK
and DT_DIR
and DT_REG
.
However, when d_type
is DT_LNK
, there is no hint about whether the link is to a file or directory.
Is there a a way to check whether the target of a symlink is a file or directory?
CodePudding user response:
The dirent
structure might tell you if the entry is a directory or a symbolic link, but some file systems do not provide this information in d_type
and set it to DT_UNKNOWN
.
In any case, the simplest way to tell if a symbolic link points to a directory or not, is via a stat
system call that will resolve the symbolic link and if successful, will populate the stat
structure, allowing for S_ISDIR
to give you the information:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int is_directory(const char *path) {
struct stat st;
return !stat(path, &st) && S_ISDIR(st.st_mode);
}
Note these caveats:
- you must construct the path from the directory name and the entry name to pass to
is_directory()
. - recursing on directories linked to by symbolic links may cause infinite recursion as the symbolic link may point to a parent directory or the directory itself where it is located.