两种方法
1.SHFileOperation删除文件
SHFileOperation()原型
Typedef struct _ShFILEOPSTRUCT
{
HWND hWnd; //消息发送的窗口句柄;
UINT wFunc; //操作类型
LPCSTR pFrom; //源文件及路径
LPCSTR pTo; //目标文件及路径
FILEOP_FLAGS fFlags; //操作与确认标志
BOOL fAnyOperationsAborted; //操作选择位
LPVOID hNameMappings; //文件映射
LPCSTR lpszProgressTitle; //文件操作进度窗口标题
}SHFILEOPSTRUCT, FAR * LPSHFILEOPSTRUCT;
wFunc 是结构中的一个非常重要的成员,它代表着函数将要进行的操作类型,它的取值为如下:
FO_COPY: 拷贝文件pFrom到pTo 的指定位置。
FO_RENAME: 将pFrom的文件名更名为pTo的文件名。
FO_MOVE: 将pFrom的文件移动到pTo的地方。
FO_DELETE: 删除pFrom指定的文件。
fFlags是在进行文件操作时的过程和状态控制标识。它主要有如下一些标识,也可以是其组合:
FOF_FILESONLY:执行通配符,只执行文件;
FOF_ALLOWUNDO:保存UNDO信息,以便在回收站中恢复文件;
FOF_NOCONFIRMATION:在出现目标文件已存在的时候,如果不设置此项,则它会出现确认是否覆盖的对话框,设置此项则自动确认,进行覆盖,不出现对话框。
FOF_NOERRORUI:设置此项后,当文件处理过程中出现错误时,不出现错误提示,否则会进行错误提示。
FOF_RENAMEONCOLLISION:当已存在文件名时,对其进行更换文提示。
FOF_SILENT:不显示进度对话框。
FOF_WANTMAPPINGHANDLE:要求SHFileOperation()函数返回正处于操作状态的实际文件列表,文件列表名柄保存在hNameMappings成员中。
SHFILEOPSTRUCT结构还包含一个SHNAMEMAPPING结构的数组,此数组保存由SHELL计算的每个处于操作状态的文件的新旧路径。
把文件移除到回收站例子 这个是转载的。我在使用这个函数的时候他会出现删除失败的情况,再csdn查询了说路径后面必须要\0结束。但是我加上去了也是会出现偶尔成功偶尔失败的情况。返回0成功,后面没找到原因下面是找到这个函数的错误码。我在使用的时候打印出来的错误码是87。后面我使用了另外一种方法,这个时候就是百分百成功了
#include <windows.h> #include <shellapi.h> wchar_t* AnsiToUnicode(const char* szStr) { int nLen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szStr, -1, NULL, 0); if (nLen == 0) { return NULL; } wchar_t* pResult = new wchar_t[nLen]; MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szStr, -1, pResult, nLen); return pResult; } bool moveToRecycleBin(const char* filePath) { int nok =0; SHFILEOPSTRUCT fileOp; ZeroMemory(&fileOp, sizeof(fileOp)); fileOp.wFunc = FO_DELETE; fileOp.pFrom = AnsiToUnicode(filePath); fileOp.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION; nok =SHFileOperation(&fileOp); return nok; }
SHFileOperation()函数错误码
错误码
描述
2
如果你试图重命名多重文件,这个消息就会出现。描述是相当直接的:系统不能找到指定的文件。
7
在询问是否想要置换给定文件时,你回答了‘取消’,函数就返回这个错误码。它的描述也是相当的不明确—存储控制块被销毁。
115
在试图重命名文件到不同的文件夹时,发生这个文件系统错。重命名文件只是改变文件名,而不能改变文件夹。
117
一个IOCTL错(输入/输出控制),在目的路径中有错误时或取消了新目录的建立时,这个错误发生了。
123
你正在试图重命名一个文件,然而你给出的名字是一个已经存在的文件。它也有一个无用的描述:文件名,目录名,或卷标号的语法是不正确的。
1026
在试图移动或拷贝一个不存在的文件时,出现这个文件系统错。一般地,它提示了,源缓冲中的某些东西应该修改一下。这个错误码弹出一个的错误框,你可以通过设置FOF_NOERRORUI标志抑制它的显示。
2.使用IFileOperation删除文件
IFileOperation有很多关于文件的操作。我就不一一介绍了。下面这个是直接移除文件到回收站代码,可以直接使用,返回真则是成功。
直接上例子 这个就可以直接移除到回收站。
BOOL Recycle(LPCTSTR pszPath) { CComPtr<IFileOperation> pFileOperation; HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); if (SUCCEEDED(hr)) { hr = CoCreateInstance(CLSID_FileOperation, NULL, CLSCTX_ALL, IID_PPV_ARGS(&pFileOperation)); if (SUCCEEDED(hr)) { pFileOperation->SetOperationFlags(/*FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT | */FOF_ALLOWUNDO); CComPtr<IShellItem> psiFrom; hr = SHCreateItemFromParsingName(pszPath, NULL, IID_PPV_ARGS(&psiFrom)); if (SUCCEEDED(hr)) { hr = pFileOperation->DeleteItem(psiFrom, NULL); if (SUCCEEDED(hr)) { hr = pFileOperation->PerformOperations(); } } } CoUninitialize(); } return SUCCEEDED(hr); }