SHFileOperationを使う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include <windows.h> #include <tchar.h> #include <assert.h> #include <malloc.h> #include "SHDeleteFile.h" BOOL SHDeleteFile(LPCTSTR lpFile) { size_t len = _tcslen(lpFile); if(!lpFile || lpFile[0]==0 || len <= 3) return FALSE; // フルパスのみ許す do { #ifndef UNICODE if (IsDBCSLeadByte((BYTE)lpFile[0])) return FALSE; #endif if( lpFile[0]==_T('\\') && lpFile[1]==_T('\\') ) break; if( lpFile[1] == _T(':') && lpFile[2]==_T('\\') ) break; return FALSE; } while(false); LPTSTR p = (LPTSTR)_alloca( (len+2)*sizeof(TCHAR) ); if(!p) return FALSE; _tcscpy(p, lpFile); p[len+1]=0; SHFILEOPSTRUCT sfo = {0}; sfo.hwnd = NULL; sfo.wFunc = FO_DELETE; sfo.pFrom = p; sfo.pTo = NULL; // ignored sfo.fFlags = FOF_ALLOWUNDO; int ret = SHFileOperation(&sfo); return ret==0; } |
1つのファイルだけで試した。フォルダの場合は試していない。ファイルが複数ある時はNULで繋げて最後をダブルヌルにする。1個の場合でもダブルヌルにしなくてはならないので面倒くさい。