Как узнать, существует ли файл или каталог? - PullRequest
1 голос
/ 23 августа 2010

Я пытаюсь создать простую программу, которая обрабатывает файлы и каталоги, но у меня есть две основные проблемы:

  • как я могу проверить, существует файл или каталог или нет, и
  • как узнать, является ли это файл, каталог, символическая ссылка, устройство, именованный канал и т. Д.?В основном файл и каталоги имеют значение на данный момент, но я бы хотел знать и другие.

РЕДАКТИРОВАТЬ: Слишком все те, кто предлагает использовать stat() или подобная функция, я уже рассмотрел это, и хотя она может ответить на мой первый вопрос, я не могу понять, как она ответит на второй ...

Ответы [ 3 ]

6 голосов
/ 23 августа 2010

Поскольку вы спрашиваете об именованных каналах / символических ссылках и т. Д., Вы, вероятно, используете * nix, поэтому используйте lstat () функция

struct stat info;

if(lstat(name,&info) != 0) {
  if(errno == ENOENT) {
   //  doesn't exist
   } else if(errno == EACCES) {
    // we don't have permission to know if 
   //  the path/file exists.. impossible to tell
   } else {
      //general error handling
   }
  return;
}
//so, it exists.

if(S_ISDIR(info.st_mode)) {
  //it's a directory
} else if(S_ISFIFO(info.st_mode)) {
  //it's a named pipe 
} else if(....) {
}

Se docs здесь для макросов S_ISXXX, которые вы можете использовать.

2 голосов
/ 23 августа 2010

Функция stat () должна дать вам все, что вы ищете (или, точнее, lstat(), поскольку stat() будет следовать по ссылке).

1 голос
/ 23 августа 2010

Используйте stat (или если вы хотите получить информацию о символической ссылке вместо того, чтобы следовать по ней и получать информацию о месте назначения, lstat )

ИМЯ

stat - получить статус файла

СИНТАКСИС

#include <sys/stat.h>

int stat(const char *restrict path, struct stat *restrict buf);

ОПИСАНИЕ

Функция stat () должна получить информацию об именованном файле и записать ее в область, указанную аргументом buf. Аргумент пути указывает на путь к файлу. Разрешение на чтение, запись или выполнение указанного файла не требуется. Реализация, которая обеспечивает дополнительные или альтернативные механизмы управления доступом к файлам, может в определенных условиях реализации вызывать сбой stat (). В частности, система может отрицать существование файла, указанного путем.

Если названный файл является символической ссылкой, функция stat () должна продолжить разрешение имени, используя содержимое символической ссылки, и должна вернуть информацию, относящуюся к результирующему файлу, если файл существует.

Аргумент buf - это указатель на структуру stat, как определено в заголовке, в которую помещается информация о файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...