Какую функцию Win32 API использовать для удаления папки? - PullRequest
22 голосов
/ 17 октября 2008

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

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

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

Ответы [ 6 ]

29 голосов
/ 20 октября 2008

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

16 голосов
/ 17 октября 2008

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

12 голосов
/ 27 сентября 2011

См. Комментарий 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.
}
9 голосов
/ 18 октября 2008

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

2 голосов
/ 08 января 2013
    /* 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);
            }
1 голос
/ 01 июня 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...