📄 drivecleardlg.cpp
字号:
// driveclearDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "driveclear.h"
#include "driveclearDlg.h"
#include "strsafe.h"
#define buferlen 2097152
bool isdoing=false;
ULONGLONG spacecanuse;
LPCTSTR localdrive=new TCHAR[16];
HWND prowind;
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CdriveclearDlg 对话框
CdriveclearDlg::CdriveclearDlg(CWnd* pParent /*=NULL*/)
: CDialog(CdriveclearDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CdriveclearDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CdriveclearDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CLOSE()
//}}AFX_MSG_MAP
ON_CBN_SELCHANGE(IDC_COMBO1, &CdriveclearDlg::OnCbnSelchangeCombo1)
//ON_BN_CLICKED(IDCANCEL, &CdriveclearDlg::OnBnClickedCancel)
ON_BN_CLICKED(IDC_BUTTON1, &CdriveclearDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CdriveclearDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDSTART, &CdriveclearDlg::OnBnClickedStart)
END_MESSAGE_MAP()
CString zxcstr(float zvalue)
{
CString zxstr;
zxstr.Format(_T("%.2f MB"),zvalue);
return zxstr;
}
void CdriveclearDlg::getdiskinfo(LPCTSTR rootpath)
{
BOOL flag;
ULARGE_INTEGER clu,sec,freeclu;
LPWSTR myvolname=new TCHAR[128];
LPWSTR myfilesys=new TCHAR[128];
LPWSTR txtbuf=new TCHAR[256];
flag= GetVolumeInformation(rootpath,myvolname,128,NULL,NULL,NULL,myfilesys,128);
if(flag!=0){
wsprintf(txtbuf,_T("%s, %s"),myvolname,myfilesys);
//MessageBox(hwnd,txtbuf,rootpath,MB_OK);
SetDlgItemText(IDC_EDIT1,txtbuf);
//CEdit *pxl=(CEdit *) GetDlgItem(hwnd,IDC_EDIT1);
//pxl->SetWindowText(txtbuf);
GetDiskFreeSpaceEx(rootpath,(PULARGE_INTEGER)&clu,(PULARGE_INTEGER)&sec,(PULARGE_INTEGER)&freeclu);
//wsprintf(txtbuf,_T("%s/%s"),(long)freeclu,(long)sec);
SetDlgItemText(IDC_EDIT2,zxcstr((float)freeclu.QuadPart/1024/1024));
//localdrive=rootpath;
StringCbCopy((STRSAFE_LPWSTR)localdrive,16,rootpath);
spacecanuse=freeclu.QuadPart;
}
else refreshdskinfo();
}
void CdriveclearDlg::refreshdskinfo(){
bool first=true;
CComboBox *pxl = (CComboBox *) GetDlgItem(IDC_COMBO1);
unsigned char r;
//LPTSTR szBuffer=new TCHAR[1024];
LPWSTR testbuf=new TCHAR[16];
pxl->ResetContent();
for(r='A';r<='Z';r++){
//testbuf[0]=r;
wsprintf(testbuf,_T("%c:\\"),r);
if(GetVolumeInformation((LPCTSTR)testbuf,NULL,NULL,NULL,NULL,NULL,NULL,NULL)!=0){
//MessageBox((LPCTSTR)testbuf,NULL,MB_OK);
pxl->InsertString(-1,(LPCTSTR )testbuf);
if(first){getdiskinfo(testbuf);first=false;}
}
}
pxl->SetCurSel(0);
}
// CdriveclearDlg 消息处理程序
BOOL CdriveclearDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
HANDLE hMutex = CreateMutex(NULL, FALSE, _T("driverclear"));
if (hMutex != NULL)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
MessageBox(_T("磁盘填充器已经在运行了"),_T("提示"),MB_OK | MB_ICONINFORMATION);
//关闭互斥对象,退出程序
CloseHandle(hMutex);
exit (0);
} else
{
//MessageBox(NULL,TEXT("第一次运行这个程序。"),TEXT("OnlyOne"),MB_OK | MB_ICONINFORMATION);
}
}
ShowWindow(SW_NORMAL);
// TODO: 在此添加额外的初始化代码
//创建互斥对象
refreshdskinfo();
SetDlgItemText(IDC_EDIT5,_T("原理:\r\n 本软件通过覆盖磁盘可用空间来达到彻底清除曾经删除的文件.\r\n\r\n作用:\r\n 可以彻底清除磁盘曾经储存但被移动、修改、删除的痕迹,这样就可以不必担心以前删除了的文件被他人使用 磁盘恢复软件 恢复了.\r\n\r\n常识:\r\n 一般常规方式删除(比如清空回收站或SHIFT+DELETE,以及在windows下的格式化)只是清除文件在文件系统中的索引位置,而文件的实体还是保存在磁盘扇区里的,所以所谓 磁盘恢复软件 依然能够恢复你已删除了的文件,只有完全清除文件在磁盘物理扇区上所占用的每一个区块才算彻底删除,所谓的 文件粉碎软件 就是这个原理."));
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CdriveclearDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CdriveclearDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSOR CdriveclearDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void WINAPI erasing (PVOID pParam) {
HANDLE hfile;
ULARGE_INTEGER a1,a2,a3;
unsigned long n;
SYSTEMTIME sys;
int nowtime;
DWORD64 countst,counten;
CdriveclearDlg m;
CString path=localdrive;
ULONGLONG tmp=spacecanuse;
char* buf=new char [buferlen];
LPWSTR txtbuf=new TCHAR[256];
BOOL userstop=false;
//memset(buf,0,sizeof(buf));
path+=_T("temp.tmp");
if(spacecanuse<=0){MessageBox(prowind,_T("剩余0字节..."),NULL,MB_OK);isdoing=false;delete buf;return;}
hfile=CreateFile(path,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,NULL,NULL);
if(hfile==INVALID_HANDLE_VALUE){MessageBox(prowind,_T("无法创建文件,介质只读或没有权限"),NULL,MB_OK);CloseHandle(hfile);isdoing=false;delete buf;return;}
else isdoing=true;
EnableWindow(GetDlgItem(prowind,IDC_BUTTON2),FALSE);
EnableWindow(GetDlgItem(prowind,IDC_COMBO1),FALSE);
//EnableWindow(GetDlgItem(prowind,IDC_CHECK1),FALSE);
SetWindowText(GetDlgItem(prowind,IDSTART),_T("停止"));
SendDlgItemMessage(prowind,IDC_PROGRESS1,PBM_SETRANGE, 0,MAKELPARAM (0,100));
GetSystemTime(&sys);
nowtime=sys.wSecond;
while(1){
countst=GetTickCount();
if(WriteFile(hfile,buf,buferlen,&n,NULL)==0 || n!=buferlen)break;
if(isdoing==false){MessageBox(prowind,_T("用户终止!"),_T("提示"),MB_OK);userstop=true;break;}
spacecanuse-=buferlen;
wsprintf(txtbuf,_T("%d MB"),spacecanuse/1024/1024);
SetDlgItemText(prowind,IDC_EDIT3,txtbuf);
SendDlgItemMessage(prowind,IDC_PROGRESS1, PBM_SETPOS, (WPARAM)((tmp-spacecanuse)*100/tmp),0);
counten=GetTickCount()-countst;
GetSystemTime(&sys);
if(sys.wSecond!=nowtime){
if(counten==0)
wsprintf(txtbuf,_T(">%d KB/S"),buferlen*1000/1024);
else
wsprintf(txtbuf,_T("%d KB/S"),(buferlen*1000/counten)/1024);
SetDlgItemText(prowind,IDC_EDIT4,txtbuf);
nowtime=sys.wSecond;
}
}
if(!userstop){
GetDiskFreeSpaceEx(localdrive,(PULARGE_INTEGER)&a1,(PULARGE_INTEGER)&a2,(PULARGE_INTEGER)&a3);
WriteFile(hfile,buf,a3.QuadPart,&n,NULL);
}
CloseHandle(hfile);
DeleteFile(path);
isdoing=false;
SendDlgItemMessage(prowind,IDC_PROGRESS1, PBM_SETPOS, (WPARAM)(100),0);
SetDlgItemText(prowind,IDC_EDIT3,_T("0 MB"));
if(userstop==false)MessageBox(prowind,_T("处理结束!"),_T("提示"),MB_OK);
EnableWindow(GetDlgItem(prowind,IDC_BUTTON2),TRUE);
EnableWindow(GetDlgItem(prowind,IDC_COMBO1),TRUE);
//EnableWindow(GetDlgItem(prowind,IDC_CHECK1),TRUE);
EnableWindow(GetDlgItem(prowind,IDSTART),TRUE);
SetWindowText(GetDlgItem(prowind,IDSTART),_T("开始"));
spacecanuse=tmp;
delete buf;delete txtbuf;
}
void CdriveclearDlg::OnCbnSelchangeCombo1()
{
// TODO: 在此添加控件通知处理程序代码
CString testbuf;
GetDlgItemText(IDC_COMBO1,testbuf);
getdiskinfo(testbuf);
}
void CdriveclearDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
if(isdoing)MessageBox(_T("正在处理,请先停止!"),NULL,MB_OK);
else CDialog::OnClose();
}
void CdriveclearDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CAboutDlg dlg;
//dlg.Create(IDD_ABOUTBOX,this);
//dlg.ShowWindow(SW_SHOW);
dlg.DoModal();
}
void CdriveclearDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
refreshdskinfo();
}
void CdriveclearDlg::OnBnClickedStart()
{
// TODO: 在此添加控件通知处理程序代码
unsigned long ThreadID;
prowind=::GetActiveWindow();
if(!isdoing){
getdiskinfo(localdrive);
CloseHandle(CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)erasing,NULL,0,&ThreadID));
}
else {
CWnd *pWnd;
pWnd=GetDlgItem(IDSTART);
pWnd->EnableWindow(FALSE);
isdoing=false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -