2009-11-17 48 views
7

我需要编写一个delphi程序来监视文件夹的变化(添加,更新,重命名和删除文件)。 TShellChangeNotifier是否要走?说实话,我不知道如何使用它。使用Delphi跟踪对文件夹所做的更改?

请帮忙。

谢谢。

+0

http://www.cromis.net/blog/downloads/directory-watch/非常优秀且免费的。 – Ampere 2017-06-16 19:19:48

回答

5

This question may help。 mghie的回答显示如何正确使用ReadDirectoryChangesW

5

我认为这篇文章将帮助您:Monitoring System Shell Changes using Delphi

基本上分析了TShellChangeNotifier,将其丢弃,然后进入一个TSHChangeNotify这基本上是为SHChangeNotify Windows API函数的包装。

+1

它似乎是监视整个文件系统,我只能将它限制为监视本地硬盘。有没有一种方法可以指定它将只监视的文件夹?我担心它可能会吃掉很多不必要的资源。非常感谢。 – Snackmoore 2009-11-17 08:22:56

+0

我不认为你可以,至少与SHChangeNotify。尽管如此,你不应该吃掉很多资源,你只会忽略任何不影响你感兴趣的路径,windows会监控你正在听的所有变化:) – 2009-11-17 08:44:19

0

我建议使用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; 
+1

我不会知道madShell,但'repeat'循环看起来非常难看。它不断抛出和捕获异常,并有一个硬编码的延迟......不是我期望从一个干净而高效的解决方案中获得的...... – jpfollenius 2009-11-17 12:34:25