我需要編寫一個delphi程序來監視文件夾的變化(添加,更新,重命名和刪除文件)。 TShellChangeNotifier是否要走?說實話,我不知道如何使用它。使用Delphi跟蹤對文件夾所做的更改?
請幫忙。
謝謝。
我需要編寫一個delphi程序來監視文件夾的變化(添加,更新,重命名和刪除文件)。 TShellChangeNotifier是否要走?說實話,我不知道如何使用它。使用Delphi跟蹤對文件夾所做的更改?
請幫忙。
謝謝。
This question may help。 mghie的回答顯示如何正確使用ReadDirectoryChangesW
。
我認爲這篇文章將幫助您:Monitoring System Shell Changes using Delphi
基本上分析了TShellChangeNotifier,將其丟棄,然後進入一個TSHChangeNotify這基本上是爲SHChangeNotify Windows API函數的包裝。
它似乎是監視整個文件系統,我只能將它限制爲監視本地硬盤。有沒有一種方法可以指定它將只監視的文件夾?我擔心它可能會吃掉很多不必要的資源。非常感謝。 – Snackmoore 2009-11-17 08:22:56
我不認爲你可以,至少與SHChangeNotify。儘管如此,你不應該吃掉很多資源,你只會忽略任何不影響你感興趣的路徑,windows會監控你正在聽的所有變化:) – 2009-11-17 08:44:19
我建議使用madShell
RegisterShellEvent(ShellEvent, pathToMonitor, false, [seItemCreated, seItemRenamed]);
//
procedure Tform.ShellEvent(event: TShellEventType; const obj1, obj2: IShellObj; drive: char; value: cardinal);
var
filename: string;
isReady: boolean;
begin
if (event = seItemCreated) then
filename := obj1.Path
else if (event = seItemRenamed) then
filename := obj2.Path
else
exit;
// try to open to ensure it's read for reading
repeat
try
TfileStream.Create(filename, fmOpenRead + fmShareExclusive).Free;
isReady := true;
except
isReady := false;
sleep(250);
end;
until (isReady) or (not FileExists(filename));
OutputDebugString(pChar('ShellEvent: ' + filename));
end;
我不會知道madShell,但'repeat'循環看起來非常難看。它不斷拋出和捕獲異常,並有一個硬編碼的延遲......不是我期望從一個乾淨而高效的解決方案中獲得的...... – jpfollenius 2009-11-17 12:34:25
http://www.cromis.net/blog/downloads/directory-watch/非常優秀且免費的。 – Ampere 2017-06-16 19:19:48