Каков наилучший способ проверить существование файла и разрешения для файлов в Linux с помощью C ++ - PullRequest
6 голосов
/ 05 февраля 2011

Я использую boost::filesystem::exists() для проверки существования файла.

Есть ли лучший способ сделать это?

Также, как мне найти разрешения для файлов?

Ответы [ 4 ]

19 голосов
/ 05 февраля 2011

Единственный правильный способ проверить, существует ли файл, - это попытаться открыть его. Единственный правильный способ проверить, доступен ли файл для записи, - это попытаться открыть его для записи. Все остальное - это состояние гонки. (Другие вызовы API могут сказать вам, если файл существовал минуту назад , но даже если бы он существовал, он может не существовать эти 15 наносекунд спустя, когда вы попытаетесь открыть его, так что они в основном бесполезны )

Однако, если вы хотите знать, существует ли файл, не открывая его, просто используйте функцию boost::filesystem::exists. Но знайте о зияющем недостатке в этом. Он не сообщает вам, существует ли файл, он сообщает, существует ли файл .

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

Если вам нужно знать, «смогу ли я открыть этот файл», тогда единственный способ выяснить это - попытаться открыть его.

5 голосов
/ 05 февраля 2011

Не думаю, что файловая система boost даст вам какую-либо информацию о разрешениях.

Я бы пошел по низкоуровневому способу (который в любом случае действительно прост для этого случая): используйте POSIX C API для проверки существования файла и разрешений: используйте `stat.


Пример:

#include <sys/stat.h>
#include <iostream>

int main(int argc, char *argv[])
{
    struct stat sb;

    if( stat("file", &sb) == -1 ) {
        std::cout << "Couldn't stat(). Cannot access file, could assume it doesn't exist" << std::endl;
        return 1;
    }

    std::cout << "Permissions: " << std::oct << (unsigned long) sb.st_mode << std::endl;

    return 0;
}

Запуск:

$ ./stat 
Couldn't stat(). Cannot access file, could assume it doesn't exist
$ touch file
$ ./stat
Permissions: 100644
4 голосов
/ 05 февраля 2011

Конечно, использование boost - это портативный способ.

Но если вы действительно интересуетесь только Linux, вы можете использовать access (2) , который скажет вам обоим,файл существует и можете ли вы получить к нему доступ по своему усмотрению (и, возможно, не вызывать оповещения аудита).

4 голосов
/ 05 февраля 2011

Не могли бы вы просто попробовать открыть файл с помощью fopen() и проверить, является ли возвращаемое значение null?

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