Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Некоторые файлы не удаляются средствами C++/WinAPI


Автор: crYon 27.6.2018, 20:34
Здравствуйте. Столкнулся со странной проблемой.

Имеется некий самодельный инсталлятор на чистом С++/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.

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

Автор: Romikgy 27.6.2018, 21:26
скорее всего установка была из под прав администратора , а удаление без них

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

Код

SetFileAttributes(FullFileName,FILE_ATTRIBUTE_NORMAL);


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)