В UNIX, если открыть файл в режиме добавления, какКак определить, был ли файл открыт для добавления в Windows?
fd = open("filename", O_APPEND);
то при такой дескриптор файла можно легко узнать, какие флаги он был открыт с помощью fcntl
:
fcntl(fd, F_GETFL) & O_APPEND
Я знаю, что fcntl
не доступен в Windows, но мне интересно, есть ли способ определить это. Windows явно поддерживает режим добавления, например, при создании файла с CreateFile
и прохождения в флагом FILE_APPEND_DATA
.
Но если все, что у меня есть, является дескриптором уже открытого файла, я не могу на всю жизнь найти способ определить, какие права доступа запрашивались при первом открытии файла. This question предоставляет базовый рецепт проверки прав доступа к определенному файлу, но это, похоже, не помогает. Я попробовал это, и даже если я открою файл с режимом только для чтения, он все равно говорит мне, что у меня есть FILE_APPEND_DATA
доступ к файлу, если бы я попросил его. Другими словами, этот метод сообщает мне только, какие права доступа к процессу имеют определенный файл (как унаследованный от пользователя, который начал процесс). В нем ничего не говорится о том, какой именно запрос запрашивался при открытии файла.
Это не имеет никакого отношения к тому, как Windows отслеживает, должен ли файл прикрепляться только к нему. И это последний вопрос, что я не могу найти ответ нигде. Самое близкое, что я нашел, это GetFileInformationByHandleEx, но после расчёта в документах нет одного атрибута файла, который может быть возвращен через этот API, который предлагает «режим добавления».
Update: Для того, чтобы прояснить мой вопрос немного лучше, этот вопрос действительно только относится к библиотеке во время выполнения MS VC - файлы, открываемые с POSIX-подобные функции _open
и записываются с fwrite
и тому подобное. Похоже, что собственные обработчики файлов win32 не имеют понятия «append mode».
Любой разум, объясняющий почему это было изменено, даже несмотря на то, что оно обеспечивает точное решение моей проблемы? – Iguananaut
Функция API Python C _PyVerify_fd, по крайней мере, на python 3 (не проверяет 2.x) также использует __pioinfo для проверки того, что данный файловый дескриптор действителен. – jsalter
@jsalter Подтверждено, Python 2 mucks around с '__pioinfo', а также в модулях/posixmodule.c. Я чувствую, что это похоже на то, что это похоже, да, это не публичный API, но это не похоже на то, что реализация будет изменяться в любое время, если вообще когда-либо, по крайней мере, для известной версии MSCRT. – Iguananaut