если файл уже открыт без

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

Однако приведенный ниже код не работает сERROR_SHARING_VIOLATION, Этоне мой вариант использования, но просто демонстрация неудачи. Сценарий использования заключается в том, что я пытаюсь переименовать файлы, которые иногда (и непредсказуемо) открываются в других процессах в системе, таких как антивирусные программы или программы резервного копирования, которые не удосужились использоватьFILE_SHARE_DELETE флаг.

# python 3
import os
import ctypes

fname1 = 'test1.txt'
fname2 = 'test2.txt'
f1 = open(fname1, 'w')
f1.write(fname1)
f2 = open(fname2, 'w')
f2.write(fname2)

# tmp123 does not exist when the program is started
ctypes.windll.kernel32.ReplaceFileW(fname2, fname1, 'tmp123', 0, None, None) # 0
ctypes.GetLastError() # ERROR_SHARING_VIOLATION

# if we close file handles, it works as expected
f1.close()
f2.close()
ctypes.windll.kernel32.ReplaceFileW(fname2, fname1, 'tmp123', 0, None, None) # 1

Зачем?

Ответы на вопрос(0)

Ваш ответ на вопрос