Проверьте наличие прав записи в файл в Windows / Linux - PullRequest
7 голосов
/ 26 сентября 2010

Я хотел бы знать, как проверить, есть ли у меня разрешения на запись в папку.

Я пишу проект на C ++ и должен напечатать некоторые данные в файл result.txt, но мне нужно знать, есть ли у меня разрешения или нет.

Отличается ли проверка между Linux и Windows? Потому что мой проект должен работать в Linux, и в настоящее время я работаю в Visual Studio.

Ответы [ 3 ]

9 голосов
/ 26 сентября 2010

Переносимый способ проверки прав доступа - попытаться открыть файл и проверить, удалось ли это. Если нет, и errno (из заголовка <cerrno> установлено значение EACCES [да, с одним S], то у вас не было достаточных разрешений. Это должно работать на обоих Unix / Linux и Windows . Пример для stdio:

FILE *fp = fopen("results.txt", "w");
if (fp == NULL) {
    if (errno == EACCES)
        cerr << "Permission denied" << endl;
    else
        cerr << "Something went wrong: " << strerror(errno) << endl;
}

Iostreams будет работать немного по-другому. AFAIK, они не гарантируют установку errno на обеих платформах или сообщают о более конкретных ошибках, чем просто «сбой».

Как писал Джерри Коффин, не полагайтесь на отдельные функции проверки доступа , поскольку ваша программа будет подвержена условиям гонки и пробелам в безопасности.

5 голосов
/ 26 сентября 2010

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

3 голосов
/ 26 сентября 2010

Самый правильный способ проверить права на запись в файл - попытаться выполнить запись в файл. Причина этого в том, что разные платформы предоставляют разрешения на запись по-разному. Хуже того, только потому, что операционная система говорит вам, что вы можете (или не можете) записывать в файл, он может фактически лежать, например, в системе Unix, режимы файлов могут разрешать запись, но файл доступен только для чтения. media или, наоборот, файл может фактически быть символьным устройством, созданным ядром для собственного использования процессов, поэтому, даже если его файловые режимы установлены на все нули, ядро ​​позволяет этому процессу (и только этому процессу) работать с ним. все это нравится.

...