Файлы по прошествии времени не могут быть удалены средствами C++/WinAPI

183
11 августа 2018, 02:30

Столкнулся со странной проблемой.

Имеется некий самодельный инсталлятор на чистом С++/WinAPI, который из zip-архива, содержащегося в ресурсе exe-шника, разархивирует группу файлов в указанный каталог. При этом, если файлы существуют, сначала он их удаляет (для эксперимента даже сделал поочередно удаление функцией DeleteFile из WinBase.h и функцией remove из stdio.h). Обнаружил, что по прошествии определенного времени (более месяца) существующие файлы перестают удаляться, функция DeleteFile не отрабатывает, а код системной ошибки GetLastError равен 0x5 ("отказано в доступе"). При этом, если проинсталлировать файлы в другой каталог, а потом сразу же попробовать проинсталлировать в него же повторно, то все файлы успешно удаляются и пересоздаются. Т.е. DeleteFile отрабатывает.

Я также сравнил свойства файла, который не может быть удален, со свойствами файла, который успешно удаляется, и не обнаружил никаких различий во вкладке "безопасность" между правами на файл для групп и пользователей. Компьютер не в домене, пользователь всего один, и учетная запись не менялась уже несколько лет. Никаких действий с учетной записью тоже не проводилось.

Инсталлятор использует библиотеку XUnzip с открытым кодом, и я проверил, что при разархивировании файлы создаются следующим вызовом функции:

CreateFile(FullFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
   FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL, NULL);

Между тем, файлы, которые создавались моим инсталлятором, но в последствии не могут быть им удалены/пересозданы, спокойно удаляются любым другим способом - через проводник или, например, Total Commander.

Проблема не только на моем компьютере, но и на многих других компьютерах. Как минимум, она повторяется на WinXP, Win7 и Win10.

Посоветуйте, пожалуйста, на что обратить внимание. Может, есть версии возможных причин. Спасибо.

Answer 1

Нашел причину. Не заметил сразу, что на файлах появились атрибуты "только для чтения". Откуда они взялись, я не знаю, но теперь перед удалением файлов я делаю вызов

SetFileAttributes(FullFileName,FILE_ATTRIBUTE_NORMAL);

и все нормально удаляется.

READ ALSO
Как сделать из куба параллелипипед C++ [OpenGL]?

Как сделать из куба параллелипипед C++ [OpenGL]?

как сделать размеру куба тоесть X,Y,Z(Ширина, Высота, Глубина)?

171
C++ контейнерный класс stack

C++ контейнерный класс stack

не могу понять как реализовать удаление элементов в контейнере класса

217
Неверное отображение серийного номера SSD диска

Неверное отображение серийного номера SSD диска

Мне необходимо получить серийные номера различных устройств хранения данныхНа данный момент написан код, корректно работающий с HDD, однако...

168
Как определить зависимость для androidX?

Как определить зависимость для androidX?

Скачал студию 32 канари вот хочу попробовать поработать с новой навигацией

185