Кроссплатформенный способ проверки, является ли файл каталогом - PullRequest
13 голосов
/ 04 февраля 2010

В настоящее время у меня есть такой код (сжато и удалено множество проверок ошибок):

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 Ответ

18 голосов
/ 04 февраля 2010

Ref http://www.nexenta.org/os/Porting_Codefixes:

Определение struct 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), чтобы следовать стандарту.

...