В настоящее время мы сталкиваемся с проблемой вызова WriteFile
(или, скорее, CFile :: Write - но это просто вызывает WriteFile внутри), что вызывает ошибку Win32 5
ERROR_ACCESS_DENIED
.
(EDIT: Обратите внимание, что мы не можем воспроизвести поведение. Все, что у нас есть на данный момент, - это файл журнала, указывающий исходную строку, где находился CFile :: Write, и содержащий ошибку ERROR_ACCESS_DENIED!)
(РЕДАКТИРОВАТЬ: файлна локальном диске, и это фактически файл, а не каталог.)
Теперь, Документация WriteFiles на самом деле не помогает, и экспериментирует с простымtest-app выдает следующие результаты:
- WriteFile вызовет причину ERROR_ACCESS_DENIED, если оно вызывается для дескриптора файла, который не открыт для записи (то есть открыт только для чтения).
- Это будет не вызвать ERROR_ACCESS_DENIED, если
- Дескриптор недопустим или файл не открыт вообще
- Права доступа или защита от записиd флаг для файла изменен после файл был открыт процессом.(Если они были изменены за до открытия файла, то мы никогда не попадем в WriteFile, потому что открытие файла завершится неудачей.)
- Файл каким-то образом заблокирован другим процессом / дескриптором (это приведет кв лучшем случае ошибка
32
ERROR_SHARING_VIOLATION).
Это оставляет нас в ситуации, которая, по-видимому, единственная возможность для этого вызова потерпеть неудачу, если файл действительно был открыт сфлаг чтения вместо флага записи.Однако, глядя на наш код, это кажется крайне маловероятным.(Из-за нашей трассировки мы можем быть уверены, что WriteFile не удалось, а мы можем быть уверены, что ошибка ERROR_ACCESS_DENIED, мы не можем быть на 100,1% уверены воткрывающие флаги, потому что они не прослеживаются.)
Существуют ли другие известные обстоятельства, когда WriteFile (CFile :: Write) может вызвать ERROR_ACCESS_DENIED?
Примечание :Чтобы дополнительно уточнить контекст этого вопроса:
- Файл был открыт , поэтому он не может быть каталогом или чем-то таким
- Все выполненные тесты указываютчто, пока файл открыт, его нельзя удалить, поэтому файл должен все еще быть там при вызове WriteFile
- Файл расположен на локальном диске, а не на сетевом диске.
Я должен добавить, что мы работаем на WIndows XP sp3 и приложение скомпилировано с Visual Studio 2005.