2015-07-26 8 views
0

Как проверить, существует ли файл или существует, но у меня нет разрешения на его чтение?Проверьте, не существует ли файл или разрешено ли разрешение C

Я знаю, что я могу использовать материал как perror() или strerror(errno) печатать сообщения, но если я хочу проверить, что я могу справиться, как это, как я могу это сделать:

if (not exist) { 
    create file; 
} 
else if (no permission) { 
    exit; 
} 

Это код, я работа над. Я думаю, err всегда = -1, когда файл не существует или у меня нет разрешения, поэтому я не знаю, как с этим бороться.

int fdPath, n, err; 
    unsigned char buffer[4096]; 
    char *path; 

    // get path 
    path = argv[1]; 

    // get file descriptor from opening file 
    fdPath = open(path, O_RDWR); 

    err = read(fdPath, buffer, 4096); // read file in path 
+0

Попробуйте открыть файл и проверить errno. Он (не переносимый) скажет вам причину, если произошел сбой. –

ответ

4

На странице open(2) человек:

RETURN VALUE 
    open(), openat(), and creat() return the new file descriptor, 
    or -1 if an error occurred (in 
    which case, errno is set appropriately). 

Это говорит вам, что если вы хотите, чтобы выяснить причину, по которой системный вызов не удалось, необходимо проверить переменную errno, который может быть установлен на что-то вроде EACCESS (разрешено отклонено) или ENOENT (нет такого файла или каталога) и т. д.

This выглядит как пример.

5

Не пытайтесь знать , можете ли вы писать или читать из файла - у вас будет состояние гонки, когда информация изменяется между вашей проверкой и фактическим доступом. Сделайте что-то вроде следующего

int fd = open(path, O_RDWR|O_CREAT, 00666); 
if (fd < 0) exit(1); 

Если вы должны знать причину, почему вы не можете открыть или создать файл, вам нужно, конечно, некоторый код, который проверяет errno.

Редактировать, чтобы уточнить: O_CREAT будет пытаться создать файл, если он еще не существует. Но эта проверка выполняется внутри операционной системы, поэтому это атомная операция для вашего процесса (ни один другой процесс не может изменить ситуацию между попыткой открыть файл и попытаться его создать).

+0

Обратите внимание, что в зависимости от ваших конкретных потребностей добавление флага 'O_EXCL' к' open' также может быть полезно - если он включен, файл будет создан только в том случае, если он еще не существует. –

+0

@JohnHascall нет, это неправильно. 'O_EXCL' с' O_CREAT' будет * сбой *, если файл существует. 'O_CREAT' просто откроет его (не создавая его) –

+0

Я думал, что это то, что я сказал ... –

2

В системах POSIX вы можете использовать access, чтобы проверить, что файл существует и/или доступен для чтения. Однако имейте в виду, что если вы сначала проверите существование файла, а затем, если он не существует, создайте его, существует возможная раса (между проверкой существования &).

Смежные вопросы