Проверка разрешений на запись в файл в Windows / Linux

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

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

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

3 ответов


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

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 на обеих платформах, или сообщайте о более конкретных ошибках, чем просто "сбой".

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


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


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