Кросс-платформенный способ проверки того, является ли файл каталогом
В настоящее время у меня есть некоторый код (сжатый и удаленный пакет проверки ошибок):
dp = readdir(dir);
if (dp->d_type == DT_DIR) {
}
Это работает плавно на моей машине Linux. Однако на другой машине (выглядит как SunOS, sparc):
SunOS HOST 5.10 Generic_127127-11 sun4u sparc SUNW,Ultra-5_10
Во время компиляции я получаю следующую ошибку:
error: structure has no member named `d_type'
error: `DT_DIR' undeclared (first use in this function)
Я думал, что заголовок dirent.h
был кроссплатформенным (для POSIX-машин). Любые предложения.
Ответы
Ответ 1
Ref http://www.nexenta.org/os/Porting_Codefixes:
Определение структуры dirent в Solaris не содержит поля d_type
. Вам нужно будет внести изменения следующим образом
if (de->d_type == DT_DIR)
{
return 0;
}
изменяется на
struct stat s; /*include sys/stat.h if necessary */
..
..
stat(de->d_name, &s);
if (s.st_mode & S_IFDIR)
{
return 0;
}
Так как stat
также является стандартом POSIX, он должен быть более кросс-платформенным. Но вы можете использовать if ((s.st_mode & S_IFMT) == S_IFDIR)
для соответствия стандарту.