| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Вопрос по SHFileOperation и удаление |
| Автор: den1977 23.8.2010, 12:13 | ||
| Из папки 'C:\Test\' нужно удалить все файлы подкаталоги (оставив саму папку 'C:\Test\' ) Делаю так:
В целом работает (удаляет из указанной папки все как надо), но если вдруг попадается занятый файл, то выдается сообщение и удаление прекращается. http://ipicture.ru/Gallery/Viewfull/938426.html Как сделать чтобы вместо вывода сообщения - стало - пропустить занятые файлы и продолжить удаление остальных файлов и папок?? Если можно, то пожайлуста внесите нужные изменения в код или дайте примерчик как это сделать! |
| Автор: kami 23.8.2010, 12:25 | ||
|
| Автор: Alexeis 23.8.2010, 12:26 |
Никогда не видел, чтобы винда осуществляла такое поведение при удалении папок. Предполагаю, что придется таки самому делать рекурсивный обход и игнорить занятые файлы. Добавлено через 1 минуту и 13 секунд kami, что-то мне подсказывает, что FOF_NOERRORUI просто не выкинет сообщение об ошибке, но реально произведет отмену всей операции. |
| Автор: den1977 23.8.2010, 13:43 | ||
Да действительно если написать:
Получается отключение показа сообщение об ошибке, но дальнейшее удаление все равно отменяется!!! Но как пропустить занятые файлы (и/или папки) |
| Автор: Alexeis 23.8.2010, 13:54 |
Я бы сделал используя код аналогичный этому http://forum.vingrad.ru/topic-82343.html |
| Автор: Alexeis 23.8.2010, 14:13 | ||
А зачем тут SHFILEOPSTRUCT ? Файл/пустую диреторию можно удалить при помощи DeleteFile() . Результат можно совсем не проверять, все что не сможет так и останется. |
| Автор: den1977 23.8.2010, 15:50 | ||
| Попробовал последовать совету Alexeis Вроде все работает как мне надо, но навсякий случай попробовал выводить перед удалением результаты поиска в memo1 и увидел что имена там отбражаются довольно странно Может кто проверит и исправит то, что не так
И ксати может кто все-таки поможет с изначальным вопросм по SHFILEOPSTRUCT |
| Автор: Alexeis 23.8.2010, 19:18 |
| А зачем делать DelAllFind(path+sr.name); для файлов? файл же не папка чтобы его перечислять. Кроме того DeleteFile(path+sr.name); RemoveDir(path+sr.name+'\'); это что за "двойной удар"? |
| Автор: den1977 23.8.2010, 21:36 | ||
| Учел замечания Alexeis - мда перестарался я чуток Вроде так правильнее, пожалуйста проверьте и исправьте если, что не так Подскажите пожалуйста - заметил, что если файл или папка имеют атрибут "только чтение", то они остаются, что и куда нужно добавить в этот код для удаления файлов или папок независимо от атрибутов?
PS.: Может кто все-таки поможет с изначальным вопросм по SHFILEOPSTRUCT |
| Автор: Alexeis 23.8.2010, 21:43 |
Да, есть такое дело, можно перед удалением вызвать SetFileAttributes(path+sr.name, FILE_ATTRIBUTE_NORMAL) |
| Автор: den1977 23.8.2010, 21:54 | ||
При попытке это использовать получил такую ошибку [Pascal Error] Unit1.pas(75): E2010 Incompatible types: 'string' and 'PAnsiChar' А так прошло - SetFileAttributes(PAnsiChar(path+sr.name), FILE_ATTRIBUTE_NORMAL); - так правильно? |
| Автор: Alexeis 23.8.2010, 21:58 |
Ну да, все верно, это я ступил. В MSDN также отмечено про read only файлы. |
| Автор: den1977 23.8.2010, 22:04 |
| Alexeis и Всем большое спасибо за помощь и участие!!! Все что хотел получилось !!! PS.: Но может кто все-таки поможет с изначальным вопросм по SHFILEOPSTRUCT Теперь уже просто интерестно |