最近做一个程序,想删除某个文件夹,第一个想到的是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