[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

#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-10-06 12:23:12

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

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

场景: 1. 有时候程序须要生成一些暂时文件夹和暂时文件,在程序退出时须要删除,这时候用win32的api就可以完毕需求.自己遍历文件夹一个个removefile并非高效率的做法. //注意: //1.要删除的文件夹不能以\\结尾.仅仅能以文件夹名结尾.比方C:\\New Folder,而不是C:\\New Folder\\,不然会失败.能够使用/作为分隔符. //2.pFrom的值必须是以\0结尾的字符串,unicode字符串要以两个\0\0结尾. //3.能够使用std::string或st

Linux (mkdir rmdir)创建和删除非空目录

linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 命令格式: mkdir [选项] 目录... 命令功能: 通过 mkdir 命令可以实现在指定位置创建以 DirName(指定的文件名)命名的文件夹或目录.要创建文件夹或目录的用户必须对所创建的文件夹的父文件夹具有写权限.并且,所创建的文件夹(目录)不能与其父目录(即父文件夹)中的文件名重名,即同一个目录下不能有同名的(区分大小写). 命令参数: -m, 

php rmdir使用递归函数删除非空目录的方法

php rmdir()函数 rmdir ― 删除空目录 语法: bool rmdir ( string $dirname [, resource $context ] )尝试删除 dirname 所指定的目录. 该目录必须是空的,而且要有相应的权限. 失败时会产生一个E_WARNING级别的错误.参数:1.dirname:目录的路径. 2.context:在 PHP 5.0.0 中增加了对上下文(Context)的支持. php rmdir()删除非空目录 上面已经说过,rmdir()函数只能删

Linux删除非空目录

Linux下如何删除非空目录 这个问题很basic,不过还是困扰了我一段时间.(这里主要讨论的是命令行模式下)我本来觉得应该使用命令 rmdir但是发现它无法删除非空的目录.后来发现了原来应该使用命令 rm -rf 目录名其中参数-f表示force.使用了这个参数就不会提示你是否要删除了. GNU Linux code::blocks设置使用gnome-terminal显示console程序的输出 摘要: settings-environment-terminal to launch conso

java使用递归删除非空目录

使用递归删除非空目录 目录的创建: file.makdir(); 空目录的删除: file.delete(); 例一. package file; import java.io.File; public class Filetext { public static void main(String[] args) { show(new File("D:/999")); } public static void show(File file) { if(file.isDirectory(

php删除非空目录代码实现

<?php header("Content-type: text/html; charset=utf-8"); $dir='mydir'; function deldir($dir){ if(file_exists($dir)){ $files=scandir($dir); foreach($files as $file){ if($file!='.' && $file!='..'){ $path=$dir.'/'.$file; if(is_dir($path))

C语言实现Linux下删除非空目录

#include <sys/stat.h> #include <dirent.h> #include <fcntl.h> /** * 递归删除目录(删除该目录以及该目录包含的文件和目录) * @dir:要删除的目录绝对路径 */ int remove_dir(const char *dir) { char cur_dir[] = "."; char up_dir[] = ".."; char dir_name[128]; DIR

Linux rm(删除一个目录中的一个或多个文件或目录或删除非空目录)

rm命令.rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有文件均保持不变. rm是一个危险的命令,使用的时候要特别当心,尤其对于新手,否则整个系统就会毁在这个命令(比如在/(根目录)下执行rm * -rf).所以,我们在执行rm之前最好先确认一下在哪个目录,到底要删除什么东西,操作时保持高度清醒的头脑. 命令格式: rm [选项] 文件- 命令功能: 删除一个目录中的一个或多个文件或目录,如

linux系统下要删除非空目录

root用户下: rm -rf eclipse