ファイルをゴミ箱に移動したいときはSHFileOperationを利用する。この関数は複数のファイルのコピーをコピー、移動、名前変更、削除できるように設計されている。ここではSHFileOperationの機能を一部だけ利用して、1ファイルの削除を行う処理を実装した。
注意しなければならないことは、SHFileOperationは処理するファイルを複数指定できるように設計されている。そのためファイルパスをNULL区切りで渡し、最後のファイルパス後にNULL文字を2つ付加しなければならない。このとき非ユニコードビルドのときはNULLを1バイト付加して合計2バイトのNULL文字が並ぶようにする。ユニコードビルド時は合計4バイトのNULLが並ぶようにする。
今回は1つのファイルを処理するため、動的に確保したメモリにファイルパスをコピーし、NULL文字を追加している。そのため作成したDeleteFileToRecycleBin関数にファイル名を指定するときは従来どおりのファイル名を渡せばいい。
#include "shellapi.h"
//
// ファイルをゴミ箱へ削除
//
//SHFileOperationは複数ファイルを一括して処理できるが、ここでは1ファイルのみ削除できるようにした
//pszFileのファイル名部分にワイルドカード「*」や「?」を使うこともできる
//削除処理中の進行状況表示画面などは表示しない
//
bool DeleteFileToRecycleBin(LPCTSTR pszFile)
{
int ret;
size_t nLen;
TCHAR* pszFrom;
SHFILEOPSTRUCT sShFileOp;
if(pszFile == NULL)
return false;
//ファイルパスの文字数取得
nLen = _tcslen(pszFile);
if(nLen == 0)
return false;
//メモリ確保とファイルパスコピー
pszFrom = new TCHAR[nLen + 10];
if(pszFrom == NULL)
return false;
_tcscpy_s(pszFrom,nLen + 10,pszFile);
//ファイルパスの後ろにNULL文字を付加(Unicodeビルド時は2つのNULLバイトが付加される)
pszFrom[nLen + 1] = NULL;
//ファイル削除
::ZeroMemory(&sShFileOp,sizeof(SHFILEOPSTRUCT));
sShFileOp.wFunc = FO_DELETE;
sShFileOp.pFrom = pszFrom;
sShFileOp.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT;
ret = ::SHFileOperation(&sShFileOp);
//メモリ開放
delete pszFrom;
return (ret == 0) ? true : false;
}
void Test(void)
{
bool ret;
ret = DeleteFileToRecycleBin(_T("c:\\test.txt"));
if(ret)
::MessageBox(NULL,_T("削除しました"),_T(""),MB_OK);
else
::MessageBox(NULL,_T("削除に失敗しました"),_T(""),MB_OK);
}
