プラグラムからゴミ箱に入れようとしてみた

MSYS とかの rm だと、ゴミ箱に入らないでそのままマトリックスの彼方に放り込まれるので、
ムシャクシャ?してたんだけど、調べてみたら、SHFileOperation 関数[microsoft.com] というのがあったので、ちょっと実験してみた。

で、この SHFileOperation 関数は SHFILEOPSTRUCT 構造体[microsoft.com] の ポインタを入れないといけないらしい。
英語じゃよく分からないので、こっち[cool.ne.jp] を覧てみよう。
これは HSP 用のリファレンスなんだけど、そうじゃなくても使えると思う。

wFunc に FO_DELETE、pFrom に削除するファイル or ディレクトリの絶対パス、fFlags に少なくとも FOF_ALLOWUNDO を入れておくよ。
ということで書いたのがこちら。

// discard.cpp

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

#include <windows.h>
#include <shellapi.h>


int main(int argc, char* argv[])
{
    SHFILEOPSTRUCT  shell_op;
    char            fullpath[MAX_PATH];

    if ( argc < 2 ) {
        printf( "%s: missing operand\n", argv[0] );

        return -1;
    }

    memset( &shell_op, 0, sizeof(SHFILEOPSTRUCT) );
    memset( &fullpath, 0, MAX_PATH );

    GetFullPathName( argv[1], MAX_PATH, fullpath, NULL );

    shell_op.hwnd               = NULL;
    shell_op.wFunc              = FO_DELETE;        //!< ファイルを削除します。
    shell_op.pFrom              = fullpath;
    shell_op.pTo                = NULL;
    shell_op.fFlags             = FOF_SILENT | FOF_NOCONFIRMATION | FOF_ALLOWUNDO;    //!< ファイルをゴミ箱に入れます。
    shell_op.hNameMappings      = NULL;
    shell_op.lpszProgressTitle  = NULL;

    int     ret;
    if ( (ret = SHFileOperation( &shell_op )) != 0 ) {
        printf( "%s:error: %d\n", argv[0], GetLastError() );
    }
    printf( "ret = %d\n", ret );
    if ( ret == 0 )
        printf( "removed: %s\n", argv[1] );
}

複数ファイルを指定して削除はまたあとで。