一次惨痛的教训

最近做一个程序,想删除某个文件夹,第一个想到的是win32API RemoveDirectory 后来发现这个函数不能删除非空目录。后来去上网上在资料,找到了两种 

bool DeletePath(char * lpszPath)
{
	if(!lpszPath) return false;
	SHFILEOPSTRUCT FileOp={0};
	//允许放回回收站 不出现确认对话框 不显示一个进度对话框 不显示出错用户界面
	FileOp.fFlags = FOF_ALLOWUNDO|FOF_NOCONFIRMATION|FOF_SILENT|FOF_NOERRORUI;
	FileOp.pFrom = lpszPath; //路径
	FileOp.pTo = NULL; //一定要是NULL
	FileOp.wFunc = FO_DELETE; //删除操作
	return (SHFileOperation(&FileOp) == 0);
}

 

 这种经常出问题,且不通用。

bool deleteDirectory(const char* pszDir)
{
	WIN32_FIND_DATA fd;
	char szTempFileFind[MAX_PATH] = { 0 };
	bool bIsFinish = false;
	ZeroMemory(&fd, sizeof(WIN32_FIND_DATA));
	sprintf(szTempFileFind, "%s*.*", pszDir);

	HANDLE hFind = FindFirstFile(szTempFileFind, &fd);
	if(hFind == INVALID_HANDLE_VALUE)
		return false;
	while (!bIsFinish) //删除非空目录下的所有文件以及目录
	{
		bIsFinish = (FindNextFile(hFind, &fd)) ? false : true;
		if ((strcmp(fd.cFileName, ".") != 0) && (strcmp(fd.cFileName, "..") != 0))
		{
			char szFoundFileName[MAX_PATH] = { 0 };
			strcpy(szFoundFileName, fd.cFileName);
			if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //判断是不是目录
			{
				char szTempDir[MAX_PATH] = { 0 };
				sprintf(szTempDir, "%s%s", pszDir, szFoundFileName);
				deleteDirectory(szTempDir);
			}
			else
			{
				char szTempFileName[MAX_PATH] = { 0 };
				sprintf(szTempFileName, "%s%s", pszDir, szFoundFileName);
				DeleteFile(szTempFileName);
			}
		}
	}
	FindClose(hFind);

	if (!RemoveDirectory(pszDir)) //删除已清空了内容的目录
		return false; return true;
}

 

这个函数貌似没什么问题,而其我还增加了入口检查,判断pszDir是否为非空。但是悲剧的是如果我传的是没有字符的字符数组,问题就来了。
sprintf(szTempFileFind,  "%s*.*",  pszDir);  如果pszDir是没有字符的空字符数组时 szTempFileFind 就会是 *.* 。这个值等于这个盘的顶层目录,如d:,最后的悲剧就是你整个D盘的东西就全部会被删除。假如你里面有写了几个月的代码。。。
这个教训告诉我 不能乱抄网上的代码。。。T_T