代码拉取完成,页面将自动刷新
同步操作将从 精易科技/eapi 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
#include "..\include_eapi_header.h"
#include<shlwapi.h>
#include<shlobj_core.h>
#include<wininet.h>
#pragma comment(lib,"wininet.lib")
#pragma comment(lib,"shlwapi.lib")
//开源代码还是比较多的,github代码修改得到的
//并且其他文件要用到,所以没办法内联或者static,防止符号污染
namespace eApiDeleteFile {
#define SWEEP_BUFFER_SIZE 0x2710u
static BOOL ClearDir(const WCHAR* path)
{
//初始化文件名字符串
std::wstring lpFileName = path;
WIN32_FIND_DATAW FindFileData;
//确保文件名字符串以反斜杠结尾
if (lpFileName[lpFileName.size() - 1] != L'\\')
{
lpFileName += L"\\";
}
//将通配符附加到文件名
lpFileName += L"*.*";
//查找目录中的第一个文件
HANDLE hFindFile = FindFirstFileW(lpFileName.c_str(), &FindFileData);
BOOL result = FALSE;
//检查句柄是否有效
if (hFindFile == INVALID_HANDLE_VALUE)
{
result = FALSE;
}
else
{
//遍历目录中的所有文件
BOOL IsHas = FALSE;
do
{
IsHas = FindNextFileW(hFindFile, &FindFileData);
//跳过当前目录和父目录
if (wcscmp(FindFileData.cFileName, L".") && wcscmp(FindFileData.cFileName, L".."))
{
ClearDir(FindFileData.cFileName);
}
else
{
//删除当前目录或父目录
DeleteFileW(lpFileName.c_str());
}
} while (IsHas);
//清理
FindClose(hFindFile);
result = TRUE;
}
return result;
}
static BOOL WipeFile(LPCWSTR szDir, LPCWSTR szFile)
{
std::wstring sPath;
HANDLE hFile;
DWORD dwSize;
DWORD dwWrite;
char sZero[SWEEP_BUFFER_SIZE];
memset(sZero, 0, SWEEP_BUFFER_SIZE);
sPath = szDir;
sPath += L'\\';
sPath += szFile;
hFile = ::CreateFileW(sPath.c_str(), GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return FALSE;
}
dwSize = ::GetFileSize(hFile, NULL);
dwSize -= 64;
::SetFilePointer(hFile, 64, NULL, FILE_BEGIN);
while (dwSize > 0)
{
if (dwSize > SWEEP_BUFFER_SIZE)
{
::WriteFile(hFile, sZero, SWEEP_BUFFER_SIZE, &dwWrite, NULL);
dwSize -= SWEEP_BUFFER_SIZE;
}
else
{
::WriteFile(hFile, sZero, dwSize, &dwWrite, NULL);
break;
}
}
CloseHandle(hFile);
return TRUE;
}
static BOOL WipeFile(LPCSTR szDir, LPCSTR szFile)
{
std::string sPath;
HANDLE hFile;
DWORD dwSize;
DWORD dwWrite;
char sZero[SWEEP_BUFFER_SIZE];
memset(sZero, 0, SWEEP_BUFFER_SIZE);
sPath = szDir;
sPath += '\\';
sPath += szFile;
hFile = ::CreateFileA(sPath.c_str(), GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return FALSE;
}
dwSize = ::GetFileSize(hFile, NULL);
dwSize -= 64;
::SetFilePointer(hFile, 64, NULL, FILE_BEGIN);
while (dwSize > 0)
{
if (dwSize > SWEEP_BUFFER_SIZE)
{
::WriteFile(hFile, sZero, SWEEP_BUFFER_SIZE, &dwWrite, NULL);
dwSize -= SWEEP_BUFFER_SIZE;
}
else
{
::WriteFile(hFile, sZero, dwSize, &dwWrite, NULL);
break;
}
}
CloseHandle(hFile);
return TRUE;
}
BOOL EmptyDirectory(const CHAR* Path, BOOL bDeleteDesktopIni, BOOL bIndex) {
std::string lpFileName = std::string(Path) + "\\*.*";
std::string lpPathName;
WIN32_FIND_DATAA FindFileData;
HANDLE hFindFile = FindFirstFileA(lpFileName.c_str(), &FindFileData);
if (hFindFile == INVALID_HANDLE_VALUE) {
return false;
}
bool result = true;
do {
if (strcmp(FindFileData.cFileName, ".") != 0
&& strcmp(FindFileData.cFileName, "..") != 0
&& (bDeleteDesktopIni || strcmp(FindFileData.cFileName, "desktop.ini") != 0)) {
lpPathName = std::string(Path) + "\\" + FindFileData.cFileName;
DWORD dwFileAttributes = GetFileAttributesA(lpPathName.c_str());
if (dwFileAttributes & FILE_ATTRIBUTE_READONLY) {
dwFileAttributes &= 0xFE;
}
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if (!EmptyDirectory(lpPathName.c_str(), bDeleteDesktopIni, bIndex)) {
result = false;
break;
}
if (!RemoveDirectoryA(lpPathName.c_str())) {
result = false;
break;
}
}
else {
if (bIndex && strcmp(FindFileData.cFileName, "index.dat") == 0) {
if (!WipeFile(Path, FindFileData.cFileName)) {
result = false;
break;
}
}
if (!DeleteFileA(lpPathName.c_str())) {
result = false;
break;
}
}
}
} while (FindNextFileA(hFindFile, &FindFileData));
FindClose(hFindFile);
return result;
}
BOOL EmptyDirectory(const WCHAR* Path, BOOL bDeleteDesktopIni, BOOL bIndex) {
std::wstring lpFileName = std::wstring(Path) + L"\\*.*";
std::wstring lpPathName;
WIN32_FIND_DATAW FindFileData;
HANDLE hFindFile = FindFirstFileW(lpFileName.c_str(), &FindFileData);
if (hFindFile == INVALID_HANDLE_VALUE) {
return false;
}
bool result = true;
do {
if (wcscmp(FindFileData.cFileName, L".") != 0
&& wcscmp(FindFileData.cFileName, L"..") != 0
&& (bDeleteDesktopIni || wcscmp(FindFileData.cFileName, L"desktop.ini") != 0)) {
lpPathName = std::wstring(Path) + L"\\" + FindFileData.cFileName;
DWORD dwFileAttributes = GetFileAttributesW(lpPathName.c_str());
if (dwFileAttributes & FILE_ATTRIBUTE_READONLY) {
dwFileAttributes &= 0xFE;
}
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if (!EmptyDirectory(lpPathName.c_str(), bDeleteDesktopIni, bIndex)) {
result = false;
break;
}
if (!RemoveDirectoryW(lpPathName.c_str())) {
result = false;
break;
}
}
else {
if (bIndex && wcscmp(FindFileData.cFileName, L"index.dat") == 0) {
if (!WipeFile(Path, FindFileData.cFileName)) {
result = false;
break;
}
}
if (!DeleteFileW(lpPathName.c_str())) {
result = false;
break;
}
}
}
} while (FindNextFileW(hFindFile, &FindFileData));
FindClose(hFindFile);
return result;
}
static BOOL DeleteUrlCache(INT type)
{
HANDLE hEntry;
LPINTERNET_CACHE_ENTRY_INFOW lpCacheEntry = nullptr;
DWORD dwEntrySize;
dwEntrySize = 0;
hEntry = FindFirstUrlCacheEntryW(NULL, NULL, &dwEntrySize);
lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFOW) new char[dwEntrySize] {0};
hEntry = FindFirstUrlCacheEntryW(NULL, lpCacheEntry, &dwEntrySize);
if (hEntry == NULL)
{
delete[] lpCacheEntry;
return FALSE;
}
do
{
if (type)
{
if (type == 1 && lpCacheEntry->CacheEntryType & COOKIE_CACHE_ENTRY)
{
DeleteUrlCacheEntryW(lpCacheEntry->lpszSourceUrlName);
}
}
else if (!(lpCacheEntry->CacheEntryType & COOKIE_CACHE_ENTRY))
{
DeleteUrlCacheEntryW(lpCacheEntry->lpszSourceUrlName);
}
dwEntrySize = 0;
FindNextUrlCacheEntryW(hEntry, NULL, &dwEntrySize);
delete[] lpCacheEntry;
lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFOW) new char[dwEntrySize] {0};
} while (FindNextUrlCacheEntryW(hEntry, lpCacheEntry, &dwEntrySize));
delete[] lpCacheEntry;
return TRUE;
}
/*可以被省略。临时文件类型,可以为以下常量值之一:0、#接口常量.系统临时文件;1、#接口常量.IE临时文件;2、#接口常量.回收站;3、#接口常量.存根文件。*/
static BOOL DeleteTempFile(INT type)
{
BOOL result = FALSE;
WCHAR Buffer[MAX_PATH] = { 0 };
switch (type)
{
case 0:
if (!GetTempPathW(MAX_PATH, Buffer)) {
result = FALSE;
break;
}
result = EmptyDirectory(Buffer, TRUE, FALSE);
break;
case 1:
result = DeleteUrlCache(0);
if (!SHGetSpecialFolderPathW(0, Buffer, CSIDL_INTERNET_CACHE, FALSE)) {
result = FALSE;
break;
}
ClearDir(Buffer);
break;
case 2:
result = SHEmptyRecycleBinA(0, 0, SHERB_NOCONFIRMATION | SHERB_NOPROGRESSUI | SHERB_NOSOUND) == 0;
break;
case 3:
result = DeleteUrlCache(1);
if (SHGetSpecialFolderPathW(0, Buffer, CSIDL_COOKIES, FALSE)) {
ClearDir(Buffer);
}
break;
default:
break;
}
return result;
}
}
// 调用格式: SDT_BOOL 删除临时文件, 命令说明: "删除指定位置的临时文件。成功返回真;失败返回假。"
// 参数<1>: [临时文件类型 SDT_INT], 参数说明: "可以被省略。临时文件类型,可以为以下常量值之一:0、#接口常量.系统临时文件;1、#接口常量.IE临时文件;2、#接口常量.回收站;3、#接口常量.存根文件。"
EAPI_EXTERN_C void eapi_DeleteTempFile_26_eapi(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
signed int type = 0;;
if (pArgInf->m_dtDataType || pArgInf->m_int >= 0 || pArgInf->m_int <= 3) {
type = pArgInf->m_int;
}
pRetData->m_bool = eApiDeleteFile::DeleteTempFile(type);
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。