Удаление или переименование файла с помощью открытого дескриптора

Функция API Windows CreateFile позволяет указать желаемый доступ. Существует три варианта чтение, запись и удаление. Если вы получаете дескриптор из CreateFile, запрашивающий удаление доступа, как вы удаляете файл с помощью возвращаемого дескриптора? Функция DeleteFile принимает имя файла, а не дескриптор.

Большая картинка: При сохранении файлов из моего приложения сначала выписываюсь во временный файл, а затем удаляем "реальный" файл и переименовываем временный файл в настоящее имя. Я начал видеть проблемы с поисковыми индексаторами, или антивирус/шпионское ПО, открывающее файл для чтения, но не позволяя удалять. Это приводит к сбою моего сохранения при перемещении файлов. Я изменил свой открытый код, чтобы запросить доступ к нему, чтобы убедиться, что я могу удалить файл, когда придет время для сохранения.

Все работает отлично, но у меня все еще есть пробел, когда стороннее приложение может захватить мой файл. Поскольку у меня есть открытая ручка для временного и реального файлов, я искал способ выполнить функции удаления и переименования с помощью этих дескрипторов. Единственный вариант, который я могу найти, - это закрыть дескрипторы, а затем вызвать функции DeleteFile и MoveFile. Фактически я в настоящее время использую функцию API ReplaceFile для выполнения этих шагов, но у нее также есть имена файлов, которые были переданы и не будут работать, если я сначала не закрою свои дескрипторы.

Мне все еще нужно поддерживать XP и не могу начать использовать новые функции файлов транзакций. Есть ли способ заблокировать файлы и удалить/переименовать их?

Ответ 1

В Windows Vista есть функция SetFileInformationByHandle, которая может делать то, что вам нужно.

В предыдущих версиях Windows такой функции нет, но у вас есть эквивалентная собственная, а не довольно публичная функция NtSetInformationFile.

У меня нет опыта работы с этими функциями, а также Windows-машина для их проверки, поэтому я не могу показать вам код, но это не должно быть так сложно.

Разумеется, общее ограничение ответственности за собственные функции Windows.