удалить всё содержимое папки

Тема в разделе "WASM.BEGINNERS", создана пользователем vg, 15 май 2007.

  1. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Нужно удалить всё содержимое папки, включая вложеные папки.
    Есть код

    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(или любым другим). Маска *.* не работает.
    Что можно сделать?
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Вообще-то маска для любого типа файлов должна выглядеть так: *
    Или я чего-то не понял...
     
  3. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Так тоже не работает.
     
  4. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    попробуй устанавливать стандартные атрибуты у файлов перед удалением

    а если проблема в поиске, тогда сначала сделай SetCurrentDirectory на ту папку, где файлы, а потом ищи их. По-моему, нельзя вот так задавать маску с путем в др. папке. Я тоже с таким сталкивался.
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    Но он удаляет только файлы с расширением txt(или любым другим). Маска *.* не работает.
    Если задана маска '*' или '*.*' (afaik разницы нет), то первым найденным элементом каталога будет '.', твоя программа пытается его DeleteFile, он (элемент каталога) не хочет этого, поэтому происходит
    Код (Text):
    1. test eax,eax
    2. jz retry
    и программа завершится "успешно".
     
  6. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Точно. Спасибо.
    Только остался ещё вопрос. Как удалить содержимое вложеных папок?
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    Как удалить содержимое вложеных папок?
    Организовать, например, при помощи рекурсии, выполнение того же кода, чтобы в качестве первого аргумента для FindFirstFile передавался адрес строки содержащей полный путь к очередной подчиненной папке.

    Если необходимо полностью (т.е. удалить и файлы, и дерево подчиненных папок) очистить какую-либо папку, то можно воспользоваться
    Код (Text):
    1. ...
    2. pathfordelete db "С:\path\*.*",0 ;; для очистки папки 'С:\path\'
    3. ;; pathfordelete db "С:\path",0 ;; для очистки папки 'С:\path\' и удаления ее самой
    4. ...
    5.   invoke DeleteTree, offset pathfordelete
    6.  
    7. DeleteTree proc pszFileSpec : ptr byte
    8.   local fos : SHFILEOPSTRUCT
    9.  
    10.   invoke RtlZeroMemory, addr fos, sizeof fos
    11.   mov fos.wFunc, FO_DELETE
    12.   push pszFileSpec
    13.   pop fos.pFrom
    14.  
    15. ;; если в корзину то добавить
    16. ;; or fos.fFlags, FOF_ALLOWUNDO
    17.  
    18.   invoke SHFileOperation, addr fos
    19. ;; Returns zero if successful, or nonzero otherwise
    20. ret
    21. DeleteTree endp
    22. ...
     
  8. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Если удалить папку - RemoveDirectory. Если только ее содержимое, тогда, при нахождении папки, делаешь ее текущей (SetCurrentDirectory) и вызываешь снова функцию поиска - т.е. в рекурсии.
     
  9. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Как папку найти?
     
  10. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    Как папку найти?
    Проверяй установлен ли бит FILE_ATTRIBUTE_DIRECTORY в поле WFD.dwFileAttributes для очередного элемента каталога.

    MSoft
    По-моему, нельзя вот так задавать маску с путем в др. папке.
    Можно.
     
  11. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    q_q, спасибо, буду знать
     
  12. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    SHFileOperation
     
  13. KondraT

    KondraT Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    175
    точнее: строки должны перечисляться через 1 завершающий нуль, последняя строка списка - 2мя завершающими нулями.
     
  14. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Предложение модераторам: давайте сменим у KondraT Воин дзена на Некропостер дзена?
     
  15. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Логичнее было бы, если темы, в которые никто давно не писал (скажем, месяца три), атоматом обретали некий новый статус "давно не использовалась", например, отмеченный значком паутины :) (ну типа как закрытые темы обозначаются замком).
     
  16. valentin_p

    valentin_p New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2011
    Сообщения:
    382
    да мысль хорошая, только значок должен мотивировать найти ответ и закрыть тему
     
  17. KondraT

    KondraT Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    175
    для особо остроумных троллей, нетерпимых к некропостенгу: у меня сей метод удаления не работал и я долго искал в чем дело. а потом отписал тут чтоб кто-то тоже не терял кучу времени на эту мелочь.
     
  18. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Ты четыре года MSDN в интернете искал что-ли?
     
  19. KondraT

    KondraT Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    175
    не, пост не мой что ли.