#include"stdafx.h"
#include<windows.h>
#include<regex>
#include<iostream>
#include "stdio.h"
using namespace std;
char* wideCharToMultiByte(wchar_t* pWCStrKey)
{
//第一次调用确认转换后单字节字符串的长度,用于开辟空间
int pSize = WideCharToMultiByte(CP_OEMCP, 0, pWCStrKey, wcslen(pWCStrKey)&0xffffffff, NULL, 0, NULL, NULL);
char* pCStrKey = new char[pSize + 1];
//第二次调用将双字节字符串转换成单字节字符串
WideCharToMultiByte(CP_OEMCP, 0, pWCStrKey, wcslen(pWCStrKey)&0xffffffff, pCStrKey, pSize, NULL, NULL);
pCStrKey[pSize] = '\0';
return pCStrKey;
}
bool IsEmptyFolder(WCHAR * lpPath)
{
WCHAR szFind[MAX_PATH], szFile[MAX_PATH];
WIN32_FIND_DATAW FindFileData;
bool IsEmpty = FALSE;
wcscpy_s(szFind, lpPath);
wcscat_s(szFind, L"\\*.*");
HANDLE hFind = ::FindFirstFileW(szFind, &FindFileData);
if (INVALID_HANDLE_VALUE == hFind)
{
return FALSE;
}
while (TRUE)
{
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (FindFileData.cFileName[0] != '.')
{
//如果有子文件夹 说明文件夹不为空
IsEmpty = FALSE;
break;
}
}
else
{
//如果有文件 说明文件夹不为空
IsEmpty = FALSE;
break;
}
if (!FindNextFileW(hFind, &FindFileData))
//去除掉当前目录路径
{
IsEmpty= true;
break;
}
}
return IsEmpty;
}
WCHAR CurrentScanPath[MAX_PATH] = { 0 };
void find(WCHAR * lpPath)
{
WCHAR szFind[MAX_PATH], szFile[MAX_PATH];
WIN32_FIND_DATAW FindFileData;
wcscpy_s(szFind, lpPath);
wcscat_s(szFind, L"\\*.*");
HANDLE hFind = ::FindFirstFileW(szFind, &FindFileData);
if (INVALID_HANDLE_VALUE == hFind)
{
return;
}
while (TRUE)
{
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (FindFileData.cFileName[0] != '.')
{
wcscpy_s(szFile, lpPath);
wcscat_s(szFile,L"\\");
wcscat_s(szFile, FindFileData.cFileName);
find(szFile);
}
}
else
{
//更新当前扫描路径
wcscpy_s(CurrentScanPath, lpPath);
char *FileName = wideCharToMultiByte(FindFileData.cFileName);
string str = FileName;
delete[]FileName;
regex regex_c(".*(\\.c$)");
regex regex_cpp(".*(\\.cpp$)");
regex regex_hpp(".*(\\.hpp$)");
regex regex_h(".*(\\.h$)");
do
{
if (regex_match(str, regex_c))
{
break;
}
if (regex_match(str, regex_cpp))
{
break;
}
if (regex_match(str, regex_h))
{
break;
}
if (regex_match(str, regex_hpp))
{
break;
}
WCHAR DeleteFileName[MAX_PATH] = { 0 };
wcscpy_s(DeleteFileName,CurrentScanPath);
wcscat_s(DeleteFileName, L"\\");
wcscat_s(DeleteFileName, FindFileData.cFileName);
if (!DeleteFileW(DeleteFileName))
{
SetFileAttributes(DeleteFileName, FILE_ATTRIBUTE_NORMAL);
if (!DeleteFileW(DeleteFileName))
{
SetFileAttributes(DeleteFileName, FILE_ATTRIBUTE_NORMAL);
printf("删除文件失败 %S 错误码%d\n", DeleteFileName, GetLastError());
break;
}
}
printf("删除成功 %S\n", DeleteFileName);
} while (0);
}
if (!FindNextFileW(hFind, &FindFileData))
{
//遍历玩一个目录后 再次遍历 如果为空 就删除这个目录
if (IsEmptyFolder(lpPath))
{
if (RemoveDirectory(lpPath))
{
printf("删除文件夹成功\n");
}
else
{
printf("删除目录失败 错误码%d\n", GetLastError());
}
}
break;
}
}
}
void main()
{
setlocale(LC_ALL, "");
WCHAR filepath[MAX_PATH] = L"F:\\迅雷下载\\Microsoft leaked source code archive_2020-09-24\\XPSP1";
find(filepath);
getchar();
}
删除目录下的特定文件
最新推荐文章于 2024-04-21 20:39:58 发布