access (path, flag) возвращает 0, даже если файл существует - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь написать программу на C для копирования содержимого из исходного файла в файл назначения.Я хочу проверить на наличие ошибок, проверив, существует ли файл и может ли пользователь прочитать его, прежде чем пытаться скопировать его.Я использую access () из unistd.h.

Вот контекст, у меня есть папка:

.
├── src.txt
├── test
└── test.c

test.c - моя программа для тестирования, если файл существует и если я могупрочитайте его.

int main(){
        char* path = "src.txt";
        fprintf(stderr, "%d\n", access(path, F_OK));
        fprintf(stderr, "%d\n", access(path, R_OK));
        return 0;
}

В этом примере, поскольку файл src.file существует и имеет разрешения 664, результат должен быть следующим:

1
1

Но фактический результат равен

0
0

Даже если я использую абсолютный путь вместо относительного пути, ведущего к src.txt, я получаю тот же результат.Что меня беспокоит, так это если я пытаюсь открыть файл, он работает:

test.c

int main(){
        char* path = "src.txt";
        fprintf(stderr, "%d\n", access(path, R_OK));
        fprintf(stderr, "%d\n", access(path, F_OK));

        FILE *f = fopen(path, "r");

        if (!f) {
                fprintf(stderr, "File couldn't be opened.\n");
        } else {
                fprintf(stderr, "File successfully opened.\n");
                fclose(f);
        }

        return 0;
}

Он выдает в качестве вывода:

0
0
File successfully opened.

Яконечно, я что-то упускаю, но не вижу, что это такое.

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

В этом примере, поскольку файл src.file существует и имеет разрешения 664, результат должен быть: 1 1? Нет. Это должно быть 0 0, как на странице руководства доступа() .

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ В случае успеха (все запрошенные разрешения предоставлены или режим F_OK и файл существует), ноль возвращается. При ошибке (по крайней мере, один бит в режиме запросил разрешение отказано , или режим F_OK и файл не существует, или произошла какая-то другая ошибка), -1 возвращается, и errno устанавливается соответствующим образом

Этот

fprintf(stderr, "%d\n", access(path, R_OK));

печатает 0 как R_OK, проверяет, существует ли файл и предоставляет ли чтение, запись,и выполнить разрешения и, как вы заявили, src.txt существует и имеет разрешение 0664, следовательно, оно печатает 0.И это

 fprintf(stderr, "%d\n", access(path, F_OK));

также печатает 0 как F_OK тесты на наличие файла и его истинность в вашем случае, следовательно, печатает 0.

0 голосов
/ 15 сентября 2018

Функция access(2) возвращает 0 в случае успеха. Он возвращает -1 в случае, если у вас нет запрошенных разрешений, или файл не существует, или поиск пути не удался. См. справочную страницу . Он также устанавливает переменную errno в соответствующий код ошибки. Таким образом, вывод 0, который вы видите, правильный, потому что у вас есть права на чтение указанного файла.

Кроме того, большинство системных вызовов возвращают -1 при ошибке (например, read(2), open(2), write(2) и т. Д.) И задают переменную errno, чтобы отразить точную возникшую ошибку. Чтобы предпринять правильное действие во время ошибки, необходимо проверить значение переменной errno.

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