現在需要實作這樣一個如題所述的功能,但是自己知識淺薄,請教各位需要用到哪些API?怎么樣去實作?
uj5u.com熱心網友回復:
可以搜一下FindFirstChangeNotification函式,還是有一些例子的,比如http://bbs.csdn.net/topics/280032788
uj5u.com熱心網友回復:
這個是BCB的代碼,至于檔案復制用CopyFileW或MoveFile函式就可以了
一、在.h檔案中添加如下代碼:
//取得系統時間---------------------------------------------------------------
#include <dos.h>
private: // User declarations
HANDLE hChange;
int counter;
public: // User declarations
二、在.cpp檔案中添加如下代碼:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
//默認按鈕狀態
Button1->Enabled = true;
Button2->Enabled = false;
//預先關閉計時器
Timer1->Enabled = false;
Timer1->Interval = 100;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// 啟動監視C:\temp目錄中的檔案異動
hChange = ::FindFirstChangeNotification("C:\\temp",
true, // 包括子目錄
FILE_NOTIFY_CHANGE_FILE_NAME);
// 若此目錄不存在
if(hChange == INVALID_HANDLE_VALUE){
ListBox1->Items->Add("C:\temp目錄不存在or無法打開!");
//送出關閉資訊,結束程式
Application->Terminate();
}else{
// 切換按鈕狀態
Button1->Enabled = false;
Button2->Enabled = true;
// 記錄啟動時間
struct time st;
gettime(&st);
ListBox1->Items->Add("啟動監視C:\\temp目錄檔案異動: " +
AnsiString(st.ti_hour) + "_" +
AnsiString(st.ti_min) + "_" +
AnsiString(st.ti_sec)
);
// 啟動計時器時,計算檔案異動值先歸零
counter = 0;
// 啟動計時器
Timer1->Enabled = true;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
// 釋放目錄handle
::FindCloseChangeNotification(hChange);
// 切換按鈕狀態
Button1->Enabled = true;
Button2->Enabled = false;
// 默認計時器狀態
Timer1->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
// 若此執行緒有所改變時,傳回資訊
DWORD rc = ::WaitForSingleObject(hChange, 0);
if(rc == WAIT_OBJECT_0){
ListBox1->Items->Add( "共有 " + AnsiString(++counter) + " 次檔案建立or更改or洗掉");
// 洗掉現在通知并等待下一更改通知
::FindNextChangeNotification(hChange);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
// 預防未釋放目錄handle
//::FindCloseChangeNotification(hChange);
}
uj5u.com熱心網友回復:
這個是BCB6的,XE的話字串改成String等寬字符型別uj5u.com熱心網友回復:
可以使用微軟未公開的API: SHChangeNotifyRegister 注冊一個通知,然后在WM_SHNOTIFY訊息中處理就行了。這種實作方法無需定時器。
uj5u.com熱心網友回復:
學習一下,
uj5u.com熱心網友回復:
用時鐘也不失為一種解決辦法uj5u.com熱心網友回復:
學習一下,這個是不是用來copy別人的U盤的?轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/115931.html
