Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > как узнать существует ли файл?


Автор: Hose 12.5.2006, 18:18
Приветствую.
Пишу програмку под *nix. Причем компилироваться она будет не мною и неизвестно на каком *nix. Сооответственно есть необходимость использовать только те функции и библиотеки, которые есть везде. Компилятор ориентировочно gcc.
Мне необходимо проверить существует ли файл по заданному пути. Какую функцию для этого лучше использовать?
Спасибо. 

Автор: GrayCardinal 12.5.2006, 18:42
$ man access
или 
:Man access
smile

Цитата

#include <unistd.h>

int access(const char *pathname, int mode);

CONFORMING TO
       SVID, AT&T, POSIX, X/OPEN, 4.3BSD

if (access ("/dev/null", R_OK) == F_OK) {
// Есть файл и может быть прочитан.
}



Или тупо через open (#include <fcntl.h>).
Цитата

CONFORMING TO
       SVr4,  SVID,  POSIX,  X/OPEN,  4.3BSD.   Only the operations F_DUPFD, F_GETFD,
       F_SETFD, F_GETFL, F_SETFL, F_GETLK, F_SETLK, F_SETLKW, F_GETOWN, and  F_SETOWN
       are  specified  in  POSIX.1.   F_GETSIG,  F_SETSIG,  F_NOTIFY, F_GETLEASE, and
       F_SETLEASE are Linux specific.  (Define the _GNU_SOURCE macro before including
       <fcntl.h>  to  obtain these definitions.)  The flags legal for F_GETFL/F_SETFL
       are those supported by open(2)  and  vary  between  these  systems;  O_APPEND,
       O_NONBLOCK, O_RDONLY, and O_RDWR are specified in POSIX.1.  SVr4 supports sev-
       eral other options and flags not documented here.



  

Автор: DeadSoul 12.5.2006, 22:01
boost::filesystem 

Автор: Spalax 16.5.2006, 08:14
Да ну не весело 

Код

if (!(fp = fopen("filename","r"))) {
  //Значит файла нету .
}
 

Автор: Mayk 16.5.2006, 08:24
Цитата(GrayCardinal @  12.5.2006,  22:42 Найти цитируемый пост)
$ man access

В кач-ве альтернативы можно использовать http://www.opengroup.org/onlinepubs/009695399/functions/stat.html (а также lstat, fstat - man автору в помощь).
 

Автор: GrayCardinal 17.5.2006, 08:51
Mayk, 
Вы б еще "link" предложили. Или "unlink" шоб не париться. 

Автор: GrayCardinal 17.5.2006, 09:12
А еще можно через "exec" и проверять код возврата.
А еще можно через socket (AF_UNIX...) + bind и тоже проверять код возврата. 

А еще можно фигней не маяться и тему закрыть. 

Автор: Hose 17.5.2006, 10:31
Всем спасибо. Тему действительно можно закрывать.

P.S.  в итоге использовал fopen(). 

Автор: Mayk 17.5.2006, 20:33
GrayCardinal, вызов link'ов, unlink'ов и exec'ов вовсе не лишён смысла в отдельных случаях. 
В конце концов, если конечной целью является удалением файла, то почему бы не воспользоваться unlink'ом?


Цитата(Hose @  17.5.2006,  14:31 Найти цитируемый пост)
Тему действительно можно закрывать.

Тема помечена решенной. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)