const int FILEMAX = 300; // allow max. 300 files in each directory
int main(int argc, char *argv[])
int i, j, iSrcFiles, iDestFiles;
char src[MAX_PATH+1], dest[MAX_PATH+1], destpath[MAX_PATH+1];
SRCFILE srcFiles[FILEMAX];
DESTFILE destFiles[FILEMAX];
DWORD dwcNameSize = MAX_PATH+1;
char szBuffer[MAX_PATH+1];
printf("argv[%d]: %s \n", i, argv[i]);
GetCurrentDirectory(dwcNameSize,(LPSTR) &szBuffer);
strcpy(destpath, dest); // destpath should be something like "k:\u002\doc\".
strcat(destpath, "\\"); // just prepare for use latter (when updating and deleting).
strcat(dest, "\\*.*"); // dest should be something like "k:\u002\doc\*.*"
strcpy(destpath, argv[2]); // destpath should be something like "k:"
// just prepare for usage latter (when updating and deleting).
strcat(dest, "*.*"); // then dest should be something like "k:*.*"
strcat(src, "*.*"); // src should be something like g:*.*
// printf("Directory listing of %s\n", src);
hFile = FindFirstFile(src, &fd);
while (hFile != INVALID_HANDLE_VALUE && bRet)
if (fd.dwFileAttributes == FILE_ATTRIBUTE_ARCHIVE) {
srcFiles[iSrcFiles].fd = fd;
srcFiles[iSrcFiles].bIsNew = FALSE;
// printf("%s\n", srcFiles[iSrcFiles].fd.cFileName);
bRet = FindNextFile(hFile, &fd);
// printf("Directory listing of %s\n", dest);
hFile = FindFirstFile(dest, &fd);
while (hFile != INVALID_HANDLE_VALUE && bRet)
if (fd.dwFileAttributes == FILE_ATTRIBUTE_ARCHIVE) {
destFiles[iDestFiles].fd = fd;
destFiles[iDestFiles].bMatch = FALSE;
// printf("%s\n", destFiles[iDestFiles].fd.cFileName);
bRet = FindNextFile(hFile, &fd);
// check for new files and redudant files
for (i=0; i<iSrcFiles; i++) {
for (j=0; j<iDestFiles; j++) {
if (!(destFiles[j].bMatch)) {
if (strcmpi(destFiles[j].fd.cFileName, srcFiles[i].fd.cFileName) == 0)
// find same files in dest directory
destFiles[j].bMatch = TRUE;
if (CompareFileTime(&destFiles[j].fd.ftLastWriteTime,
&srcFiles[i].fd.ftLastWriteTime) < 0)
// src file is new than dest file
srcFiles[i].bIsNew = TRUE;
break; // break j loop, because found!
if (bFound == FALSE) // not found, so is new.
srcFiles[i].bIsNew = TRUE;
for (i=0, j=0; i<iSrcFiles; i++) { // j for new files counter
if (srcFiles[i].bIsNew) {
printf("%s\n", srcFiles[i].fd.cFileName);
printf("no file new \n");
printf("There are %d files need to be updated \n", j);
printf("if you do not want to update these files, press Ctrl-Break \n");
printf("otherwise anykey\n");
for (i=0; i<iSrcFiles; i++)
strcat(dest, srcFiles[i].fd.cFileName);
CopyFile(srcFiles[i].fd.cFileName, dest, FALSE); // FALSE means overwrite
// deleting redudant files
for (j=0, i=0; j<iDestFiles; j++)
{ // i for redudant files counter
if (!destFiles[j].bMatch)
printf("%s\n", destFiles[j].fd.cFileName);
printf("no redudant file \n");
printf("There are %d files need to be deleted \n", i);
printf("if you do not want to delete those files, press Ctrl-Break \n");
printf("otherwise anykey\n");
for (j=0; j<iDestFiles; j++)
if (!destFiles[j].bMatch)
strcat(dest, destFiles[j].fd.cFileName);
在TextOut中想直接输出一个string型不行,它参数非得是一个LPWSTR,解决的办法是用MultiByteToWideChar,MultiByteToWideChar 函数可以把普通字符串转换为一个宽字符字符串(Unicode)
LONG OnPaint(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam)
hdc = BeginPaint(hWnd, &ps);
MultiByteToWideChar(CP_ACP,0,strInfo.c_str(),strInfo.length(),wszMsgInfo,sizeof(wszMsgInfo)/sizeof(wszMsgInfo[0]));
::TextOut(hdc,10,10,wszMsgInfo,strInfo.length());
3,对上一节的代码进行修改,加入一个新的功能,使得能从菜单呼出系统中的记事本
MSGMAP_ENTRY _commandEntries[] =
LONG OnNoteBook(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam)
PROCESS_INFORMATION pInfo;
ZeroMemory( &si, sizeof(si) );
ZeroMemory( &pInfo, sizeof(pInfo) );
bCreated = ::CreateProcess(_T("C:\\WINDOWS\\system32\\notepad.exe"),NULL,NULL,NULL,false,0,NULL,NULL,&si,&pInfo);
CloseHandle(pInfo.hProcess);
CloseHandle(pInfo.hThread);
hSysTime = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)ReadCurTime,NULL,0,&dwThrId);
WaitForSingleObject(hSysTime,INFINITE);
sprintf(buffer,"%d:%d:%d",st.wYear,st.wMonth,st.wDay);
本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/01/18/1044929.html,如需转载请自行联系原作者