Кросс-платформенный способ протестировать, является ли файл каталогом

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

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). Любые предложения.

13
задан Alex Gaynor 4 February 2010 в 07:00
поделиться

1 ответ

Маловероятно, что это будет работать в ASE без поддержки AlertManager. Лучше всего подать запрос на функцию и дождаться его. Или, если вы чувствуете себя амбициозным, расширьте ASE самостоятельно и отправьте патч!

-121--2618096-

Кто-то включил крючок в удаленном репо, который запрещает удаление - это обычно делается для того, чтобы кто-то не мог протолкнуть ребазированную ветвь в репо. (Я поддерживаю довольно большую коллекцию репозиториев git, и все они сконфигурированы таким образом, хотя и не с крючком.)

Посмотрите на крючки/каталог в удаленном репозитории. Будет сценарий с именем «update»; это то, что отказывается позволить вам удалить ветвь.

-121--2797415-

Ссылка http://www.nexenta.org/os/Porting_Codefixes :

Определение грязи структуры в 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, он должен быть более кроссплатформенным. Однако можно использовать , если (s.st _ mode & S_IFMT) = S_IFDIR) , чтобы следовать стандарту.

18
ответ дан 1 December 2019 в 23:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: