Кстати да, IceStudent совершенно прав, я как-то это проглядел. Код (Text): ... or WFD.dwFileAttributes,FILE_ATTRIBUTE_DIRECTORY jnz @F ...
Маска задается как "*". Вот что получилось в итоге. Код (Text): FindandDelete proc Directory :DWORD LOCAL SearchFilter[MAX_PATH] :byte LOCAL CurFileName[MAX_PATH] :byte LOCAL WFD :WIN32_FIND_DATA LOCAL hFind: DWORD invoke SetCurrentDirectory,Directory invoke lstrcpy,addr SearchFilter,Directory invoke lstrcat,addr SearchFilter,addr pathanymask invoke FindFirstFile,addr SearchFilter,addr WFD inc eax je exit2 dec eax mov hFind,eax deleting: invoke FindNextFile,hFind,addr WFD xchg eax,ecx jecxz exit1 test WFD.dwFileAttributes,FILE_ATTRIBUTE_DIRECTORY jz @F invoke lstrcmp,addr WFD.cFileName,addr updirmask xchg eax,ecx jecxz deleting invoke lstrcpy,addr CurFileName,Directory invoke lstrcat,addr CurFileName,addr slash invoke lstrcat,addr CurFileName,addr WFD.cFileName invoke FindandDelete,addr CurFileName jmp deleting @@: invoke DeleteFile,addr WFD.cFileName jmp deleting exit1: invoke FindClose,hFind ret exit2: FindandDelete endp
приведенный код не удаляет всех файлов - SetCurrentDirectory устанавливает директорию глобально вот правильный код: Код (Text): FindandDelete proc Directory :DWORD LOCAL SearchFilter[MAX_PATH] :byte LOCAL CurFileName[MAX_PATH] :byte LOCAL CurDir[MAX_PATH] :BYTE LOCAL WFD :WIN32_FIND_DATA LOCAL hFind: DWORD invoke GetCurrentDirectory,MAX_PATH,addr CurDir invoke SetCurrentDirectory,Directory invoke lstrcpy,addr SearchFilter,Directory invoke lstrcat,addr SearchFilter,addr pathanymask invoke FindFirstFile,addr SearchFilter,addr WFD inc eax je exit2 dec eax mov hFind,eax deleting: invoke FindNextFile,hFind,addr WFD xchg eax,ecx jecxz exit1 test WFD.dwFileAttributes,FILE_ATTRIBUTE_DIRECTORY jz @F invoke lstrcmp,addr WFD.cFileName,addr updirmask xchg eax,ecx jecxz deleting invoke lstrcpy,addr CurFileName,Directory invoke lstrcat,addr CurFileName,addr slash invoke lstrcat,addr CurFileName,addr WFD.cFileName invoke FindandDelete,addr CurFileName jmp deleting @@: invoke DeleteFile,addr WFD.cFileName jmp deleting exit1: invoke FindClose,hFind exit2: invoke SetCurrentDirectory,addr CurDir ret FindandDelete endp
wasmer Да, вы отлично это заметили! Хотя лучше всего не играться с текущей директорией - т.к. это плохой стиль - а делать полный путь для удаления походу вызова DeleteFile.
Вот мой древний-предревний сишный вариант рекурсивного поиска с вызовом хэндлера Код (Text): //--------------------------------------------------------------------------- typedef void (*HANDLER)(const char *, const WIN32_FIND_DATA *); int find(const char *, const char *, HANDLER, WIN32_FIND_DATA *); //--------------------------------------------------------------------------- int find(const char *c, const char *mask, HANDLER handler, WIN32_FIND_DATA *WFD){ char buf[MAX_PATH]; int l; int static found(0); HANDLE h; if(c && (*c)) { strcpy(buf,c);l=strlen(buf); if(buf[l-1] != '\\') { strcat(buf,"\\");l++; } } else { strcpy(buf,".\\");l=2; } strcat(buf,mask); if((h = FindFirstFile(buf, WFD)) != INVALID_HANDLE_VALUE) { buf[l]=0; do{ if(*(WFD->cFileName) != '.') { found++; handler(buf, WFD); } }while(FindNextFile(h, WFD)); FindClose(h); } buf[l]=0;strcat(buf,"*"); if((h = FindFirstFile(buf, WFD)) != INVALID_HANDLE_VALUE) { do{ if((WFD->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (*(WFD->cFileName) != '.')) { buf[l]=0;strcat(buf,WFD->cFileName); find(buf, mask, handler, WFD); } }while(FindNextFile(h, WFD)); FindClose(h); } return found; } //--------------------------------------------------------------------------- Хотя для удаления и не подойдёт - вид обхода не тот, но для поиска - норм. Да и переделать - как 2 пальца -> второй цикл перенести перед первым.
vg Ну ты зашел например рекурсивно в какую-нить директорию, в этом рекурсивном вызове сделал SetCurrentDirectory. Потом вернулся из рекурсивного вызова, текущая директория уже изменилась, а ты пытаешься удалить файлы в другой директории - на уровень выше, и при этом текущая директория другая, и изменяется она в начале вызова функции.