web-dev-qa-db-ja.com

フォルダを削除するために使用するWin32API関数は何ですか?

ファイルやフォルダをプログラムで削除するために使用するWin32APIは何ですか?

編集

DeleteFile および RemoveDirectory は私が探していたものです。ただし、このプロジェクトでは、最終的に SHFileOperation を使用しました。 CodeGuruの サンプルコード が役に立ちました。

22
Slapout

DeleteFile および RemoveDirectory が必要だと思います

16
itsmatt

これに取り組むには2つの方法があります。 1つは ファイルサービスDeleteFileRemoveDirectory などのコマンドを使用)を介して、もう1つは 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の初期化を変更することで、フィードバックとプロンプトを追加できます。よく読んでください。

30
hatcat

上記のuvgroovyのコメントを参照してください。 'dir'フィールドの最後に2つのnullが必要です。

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.
}
12
Mark Lakata

DeleteFileはファイルをごみ箱に送信しないと思います。また、RemoveDirectoryは空のdirのみを削除します。 SHFileOperation は、何をどのように削除するかを最も細かく制御でき、必要に応じて標準のWindows UIダイアログボックス(「削除の準備など」など)を表示します。

9
liggett78
    /* 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);
            }
2
Prasaathviki

C++プログラミングの場合、サードパーティのライブラリを使用する場合は、 boost :: filesystem :: remove_all(yourPath) はSHFileOperationよりもはるかに簡単です。

1
aquirdturtle