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

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

редактировать

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

6 ответов

Решение

Я думаю, что вы хотите DeleteFile и RemoveDirectory

Есть два способа приблизиться к этому. Один из них - через файловые службы (с помощью таких команд, как DeleteFile и RemoveDirectory), а другой - через оболочку Windows (используя 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 - читайте об этом.

Смотрите комментарий 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.
}

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

    /* 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);
            }

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

Другие вопросы по тегам