Нужно удалить всё содержимое папки, включая вложеные папки. Есть код pathfordelete db "С:\path\*.txt",0 invoke FindFirstFile,addr pathfordelete,addr WFD cmp eax,INVALID_HANDLE_VALUE je exit mov hFind,eax invoke DeleteFile,addr WFD.cFileName test eax,eax jz retry deleting: invoke FindNextFile,hFind,addr WFD test eax,eax jz errr invoke DeleteFile,addr WFD.cFileName jmp deleting errr: invoke GetLastError cmp eax,18 je exit retry: invoke MessageBox,0,ADDR errormsg,0,MB_OK exit: invoke FindClose,hFind Но он удаляет только файлы с расширением txt(или любым другим). Маска *.* не работает. Что можно сделать?
попробуй устанавливать стандартные атрибуты у файлов перед удалением а если проблема в поиске, тогда сначала сделай SetCurrentDirectory на ту папку, где файлы, а потом ищи их. По-моему, нельзя вот так задавать маску с путем в др. папке. Я тоже с таким сталкивался.
vg Но он удаляет только файлы с расширением txt(или любым другим). Маска *.* не работает. Если задана маска '*' или '*.*' (afaik разницы нет), то первым найденным элементом каталога будет '.', твоя программа пытается его DeleteFile, он (элемент каталога) не хочет этого, поэтому происходит Код (Text): test eax,eax jz retry и программа завершится "успешно".
vg Как удалить содержимое вложеных папок? Организовать, например, при помощи рекурсии, выполнение того же кода, чтобы в качестве первого аргумента для FindFirstFile передавался адрес строки содержащей полный путь к очередной подчиненной папке. Если необходимо полностью (т.е. удалить и файлы, и дерево подчиненных папок) очистить какую-либо папку, то можно воспользоваться Код (Text): ... pathfordelete db "С:\path\*.*",0 ;; для очистки папки 'С:\path\' ;; pathfordelete db "С:\path",0 ;; для очистки папки 'С:\path\' и удаления ее самой ... invoke DeleteTree, offset pathfordelete DeleteTree proc pszFileSpec : ptr byte local fos : SHFILEOPSTRUCT invoke RtlZeroMemory, addr fos, sizeof fos mov fos.wFunc, FO_DELETE push pszFileSpec pop fos.pFrom ;; если в корзину то добавить ;; or fos.fFlags, FOF_ALLOWUNDO invoke SHFileOperation, addr fos ;; Returns zero if successful, or nonzero otherwise ret DeleteTree endp ...
Если удалить папку - RemoveDirectory. Если только ее содержимое, тогда, при нахождении папки, делаешь ее текущей (SetCurrentDirectory) и вызываешь снова функцию поиска - т.е. в рекурсии.
vg Как папку найти? Проверяй установлен ли бит FILE_ATTRIBUTE_DIRECTORY в поле WFD.dwFileAttributes для очередного элемента каталога. MSoft По-моему, нельзя вот так задавать маску с путем в др. папке. Можно.
точнее: строки должны перечисляться через 1 завершающий нуль, последняя строка списка - 2мя завершающими нулями.
Логичнее было бы, если темы, в которые никто давно не писал (скажем, месяца три), атоматом обретали некий новый статус "давно не использовалась", например, отмеченный значком паутины (ну типа как закрытые темы обозначаются замком).
для особо остроумных троллей, нетерпимых к некропостенгу: у меня сей метод удаления не работал и я долго искал в чем дело. а потом отписал тут чтоб кто-то тоже не терял кучу времени на эту мелочь.