[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;
}
时间: 2024-08-29 18:33:04

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

[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

C 实现删除非空文件夹

[cpp] view plain copy print? /* 文件名:   rd.c ---------------------------------------------------- c中提供的对文件夹操作的函数,只能对空文件夹进行 删除,这使很多初学者在编码过程中产生许多困扰,我也 很不爽这件事情,所以编写这个对非空文件夹进行删除的 函数,仅供参考. 注意:本函数编写以VC6为依据,其中关于文件夹的操作函数 与标准c有所区别.如VC6中的findclose可能需要用c 中的close

linux_inux中find批量删除空文件及空文件夹脚本

1.{}和之间有一个空格 2.find . -name 之间也有空格 3.exec 是一个后续的命令,{}内的内容代表前面查找出来的文件 linux下批量删除空文件(大小等于0的文件)的方法 find . -name "*" -type f -size 0c | xargs -n 1 rm -f 用这个还可以删除指定大小的文件,只要修改对应的 -size 参数就行,例如: find . -name "*" -type f -size 1024c | xargs -n

删除空文件夹 清除CS扩展名文件 bat

删除空文件夹.删的干净.删的彻底. 将下列代码复制到txt中保存.并把后缀.txt命成.bat.然后运行即可. 方案1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 删除指定目录及其子目录下的空文件夹.bat 代码: @echo offecho.echo 说明此工具会删除指定目录所在空文件夹及其子目录下的空文件夹,以节省空间.echo.echo.echo 本例只限删除10层

解决Git无法同步空文件夹的问题

思路:在每个空文件夹下创建空文件,同步后再删除 1 protected static Logger logger = Logger.getLogger(CreateFileInEmptyDir.class); 2 3 private static final String createFlag = "create"; 4 private static final String fillFileName = "填充文件.txt"; 5 6 public static

git无法上传空文件夹分析

今天发现git push之后,远程仓库缺了文件夹,查资料后发现git是不能上传空文件的,解决方法是在每个空文件夹内放入一个无意义文件,这样空文件夹就不是"空"文件夹了,等到我们不需要的时候,可以把无意义文件删掉,从而达到上传"空"文件夹的目的.而放入及删除无意义文件的过程,得益于Linus的思想,我们可以批量操作. 以下代码执行于Git Bash 在每个空文件夹内加入名为.gitkeep的无意义文件: find . \( -type d -empty \) -and

tomcat发布项目时,空文件夹未发布成功

问题背景: 项目发布到服务器时,缺少文件夹,到时向此文件夹写数据时发生错误. 后来经查,缺少这个文件夹,项目部署发布时,并不会把空文件夹发布上去 解决: 1.在空文件中加入,一个文件.就可以发布成功 2.或者新创建文件时,判断这个文件夹是否有,没有就新建

ActivityGroup打开空文件夹焦点问题及返回键问题

ActivityGroup成功的解决了几个activity交替切换的问题,且比Tabhost具有更强的可拓展性. 在做一款多媒体文件浏览的软件时候,遇到了如下问题: 问题一:打开空文件夹时,由于焦点无处附着,当前activity的onPause(),默认activity的onResume(). 打开一个空文件夹,子activity的adater为空,此时子activity的焦点无处附着,运行完notifyDataSetChanged()方法之后就会走入onPause()方法,进而activity

Git提交空文件夹的技巧

这个只能说是技巧不能说是方法,原理是在每个空文件夹新建一个.gitignore文件,然后提交. 快捷命令: find . -type d -empty -exec touch {}/.gitignore \; 在项目根目录运行. 参考: https://stackoverflow.com/questions/115983/how-can-i-add-an-empty-directory-to-a-git-repository 原文地址:https://www.cnblogs.com/EasonJ