Столкнулся со странной проблемой.
Имеется некий самодельный инсталлятор на чистом С++/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.
Посоветуйте, пожалуйста, на что обратить внимание. Может, есть версии возможных причин. Спасибо.
Нашел причину. Не заметил сразу, что на файлах появились атрибуты "только для чтения". Откуда они взялись, я не знаю, но теперь перед удалением файлов я делаю вызов
SetFileAttributes(FullFileName,FILE_ATTRIBUTE_NORMAL);
и все нормально удаляется.
как сделать размеру куба тоесть X,Y,Z(Ширина, Высота, Глубина)?
не могу понять как реализовать удаление элементов в контейнере класса
Мне необходимо получить серийные номера различных устройств хранения данныхНа данный момент написан код, корректно работающий с HDD, однако...
Скачал студию 32 канари вот хочу попробовать поработать с новой навигацией