Как можно проверить, заблокирован ли файл и / или доступен только для чтения без открытия? - PullRequest
1 голос
/ 28 мая 2019

Существует ли переносимый (std :: filesystem) метод тестирования, если файл «заблокирован» или имеет разрешения «только для чтения»?Например, MacOS Finder имеет настройку «Заблокировано», которая ОТЛИЧНА от стандартных «разрешений» POSIX.

Мне нужно проверить, можно ли удалить файл, ДО ТОГО, как я пытаюсь выполнить операцию удаления.В идеале, я бы хотел не открывать файл для чтения / записи в качестве теста.

Это происходит во время процесса SAVE / RENAME, и (по крайней мере, в прошлых файловых системах MacOS) ОС вызывает «exchange»два файла работали, даже если файл был «заблокирован» в Finder.Из-за сложности, связанной с тем, как файлы сохраняются и как «сохраняются» ПРЕДЫДУЩИЕ версии, просто лучше знать заранее, чтобы избежать этой операции.

ДОПОЛНИТЕЛЬНОЕ ПРИМЕЧАНИЕ: Открытие потока как R /W (std :: ios :: out | std :: ios :: in) для заблокированного файла с разрешениями «Чтение и запись» завершится ошибкой с errno = 1 (операция не разрешена).Если файл только для чтения, но не заблокирован, произойдет сбой с ошибкой 13 (разрешение запрещено).

Здесь обсуждается особый подход MacOS (Какао) к проверке бита блокировки:

Как проверить, заблокирован ли файл в Какао?

1 Ответ

0 голосов
/ 28 мая 2019

ОК - это может быть не точный ответ, но, похоже, вы можете сделать ЭТО (как предложено здесь :

#include <sys/stat.h>

bool IsLocked(std::string& thePath)
{
    bool isLocked = false;

    struct stat buf;
    int retval = stat(thePath.c_str(), &buf);     // NOTE: retval could be an error, like ENOENT (file doesn't exist)
    if (0 != (buf.st_flags & UF_IMMUTABLE)) {
        isLocked = true;
         //is immutable
    }

    return isLocked;
}

В своем собственном коде я исправляю ошибки поиска. Тебе тоже надо!

Но ПРИМЕЧАНИЕ: хотя это правильно показывает состояние бита / флага блокировки Finder для файла, оно НЕ отражает, если файл «только для чтения». Документация по UF_IMMUTABLE гласит: «файл не может быть изменен», что явно НЕ точно.

...