删除文件到回收站

两种方法

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);
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值