[Windows]_[删除非空文件夹的注意要点]

Posted cynchanpin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Windows]_[删除非空文件夹的注意要点]相关的知识,希望对你有一定的参考价值。


场景:

1. 有时候程序须要生成一些暂时文件夹和暂时文件,在程序退出时须要删除,这时候用win32的api就可以完毕需求。自己遍历文件夹一个个removefile并非高效率的做法.


//注意:
//1.要删除的文件夹不能以\\结尾.仅仅能以文件夹名结尾。比方C:\\New Folder,而不是C:\\New Folder\\,不然会失败.能够使用/作为分隔符.
//2.pFrom的值必须是以\0结尾的字符串,unicode字符串要以两个\0\0结尾.
//3.能够使用std::string或std::wstring的c_str(),由于这个函数返回的字符串已经带\0或\0\0结尾.
//4.要删除的文件夹里的文件或文件夹的句柄必须被释放,假设有占用的句柄。删除会失败.
//5.FOF_SILENT 是设置不出现进度条窗体.
//6.FOF_NOCONFIRMATION 是不弹出确认对话框.


test_deletedir.cpp 注意,文件以utf8格式存储.

#define UNICODE

#include <windows.h>
#include <iostream>
#include <stdlib.h>
#include <assert.h>


 
using namespace std;


int WXDeleteDir(const wchar_t* path)
{
	 SHFILEOPSTRUCT FileOp;
	 FileOp.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
	 FileOp.hNameMappings = NULL;
	 FileOp.hwnd = NULL;
	 FileOp.lpszProgressTitle = NULL;
	 FileOp.pFrom = path;
	 FileOp.pTo = NULL;
	 FileOp.wFunc = FO_DELETE;
	 return SHFileOperation(&FileOp);
}

wchar_t* ConvertUtf8ToUnicode(const char* utf8)
{
	if(!utf8)
	{
		wchar_t* buf = (wchar_t*)malloc(2);
		memset(buf,0,2);
		return buf;
	}
	int nLen = ::MultiByteToWideChar(CP_UTF8,MB_ERR_INVALID_CHARS,(LPCSTR)utf8,-1,NULL,0);
	//返回须要的unicode长度  
	WCHAR * wszUNICODE = new WCHAR[nLen+1];  
	memset(wszUNICODE, 0, nLen * 2 + 2);  
	nLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)utf8, -1, wszUNICODE, nLen);    //把utf8转成unicode
	return wszUNICODE;
}

int main(int argc, char const *argv[])
{
	wchar_t* unicode = ConvertUtf8ToUnicode("C:\\Users\\apple\\Desktop\\新建文件夹");
	int res = WXDeleteDir(unicode);
	cout << "res: " << res << endl; 
	assert(!res);
	free(unicode);
	
	return 0;
}


以上是关于[Windows]_[删除非空文件夹的注意要点]的主要内容,如果未能解决你的问题,请参考以下文章

Windows10如何在终端创建文件和删除文件

codeblocks SDL开发配置的注意要点.

oracle 删除表空间及数据文件方法

windows怎么删除nodejs

windows 定时删除N天前日志脚本

8代cpu安装centos7