Подтвердить что ты не робот

Какая функция API Win32 используется для удаления папки?

Какие API-интерфейсы Win32 можно использовать для программного удаления файлов и папок?

Edit

DeleteFile и RemoveDirectory - это то, что я искал, Однако для этого проекта я закончил использование SHFileOperation. Я нашел пример кода в CodeGuru.

4b9b3361

Ответ 2

Есть два способа приблизиться к этому. Один через Файловые службы (с использованием таких команд, как DeleteFile и RemoveDirectory), а другой - через Windows Shell ( используя SHFileOperation). Последнее рекомендуется, если вы хотите удалить непустые каталоги или если хотите получить обратную связь в стиле браузера (например, диалоги прогресса с летающими файлами). Самый быстрый способ сделать это - создать SHFILEOPSTRUCT, инициализировать его и вызвать SHFileOperation, таким образом:

void silently_remove_directory(LPCTSTR dir) // Fully qualified name of the directory being deleted, without trailing backslash
{
    SHFILEOPSTRUCT file_op = {
        NULL,
        FO_DELETE,
        dir,
        "",
        FOF_NOCONFIRMATION |
        FOF_NOERRORUI |
        FOF_SILENT,
        false,
        0,
        "" };
    SHFileOperation(&file_op);
}

Это тихо удаляет весь каталог. Вы можете добавить отзывы и подсказки, изменив инициализацию SHFILEOPSTRUCT - прочитайте на нем.

Ответ 3

См. комментарий uvgroovy выше. Вам нужно 2 нули в конце поля "dir".

int silently_remove_directory(LPCTSTR dir) // Fully qualified name of the directory being   deleted,   without trailing backslash
{
  int len = strlen(dir) + 2; // required to set 2 nulls at end of argument to SHFileOperation.
  char* tempdir = (char*) malloc(len);
  memset(tempdir,0,len);
  strcpy(tempdir,dir);

  SHFILEOPSTRUCT file_op = {
    NULL,
    FO_DELETE,
    tempdir,
    "",
    FOF_NOCONFIRMATION |
    FOF_NOERRORUI |
    FOF_SILENT,
    false,
    0,
    "" };
  int ret = SHFileOperation(&file_op);
  free(tempdir);
  return ret; // returns 0 on success, non zero on failure.
}

Ответ 4

Я считаю, что DeleteFile не отправляет файл в Корзину. Кроме того, RemoveDirectory удаляет только пустые директории. SHFileOperation даст вам максимальный контроль над тем, что и как удалить, и отобразит стандартные диалоговые окна Windows UI (например, "Подготовка к удалению и т.д." ) при необходимости.

Ответ 5

    /* function used to send files and folder to recycle bin in win32 */
            int fn_Send_Item_To_RecycleBin(TCHAR newpath[]) 
            {          
            _tcscat_s(newpath, MAX_PATH,_T("|"));
            TCHAR* Lastptr = _tcsrchr(newpath, _T('|'));
            *Lastptr = _T('\0');                                         // Replace last pointer with Null for double null termination
            SHFILEOPSTRUCT shFileStruct; 
            ZeroMemory(&shFileStruct,sizeof(shFileStruct)); 
            shFileStruct.hwnd=NULL; 
            shFileStruct.wFunc= FO_DELETE; 
            shFileStruct.pFrom= newpath;
            shFileStruct.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT;
            return SHFileOperation(&shFileStruct);
            }

Ответ 6

Для программирования на C++, если вы готовы работать со сторонними библиотеками, boost:: filesystem:: remove_all (yourPath) намного проще, чем SHFileOperation.