2009-11-17 27 views
7

Tôi cần viết chương trình delphi sẽ theo dõi một thư mục để thay đổi (Thêm, cập nhật, đổi tên và xóa tệp). TShellChangeNotifier có phải là cách để đi không? Thành thật mà nói, tôi không có ý tưởng làm thế nào để sử dụng nó.Sử dụng Delphi để theo dõi các thay đổi được thực hiện cho thư mục?

Vui lòng trợ giúp.

Cảm ơn.

+0

http://www.cromis.net/blog/downloads/directory-watch/ là rất tốt và miễn phí. – Ampere

Trả lời

5

Điều này question có thể hữu ích. Câu trả lời của mghie cho thấy cách sử dụng đúng cách ReadDirectoryChangesW.

5

Tôi nghĩ rằng bài viết này sẽ giúp bạn: Monitoring System Shell Changes using Delphi

Về cơ bản nó phân tích TShellChangeNotifier, loại bỏ nó và sau đó đi cho một TSHChangeNotify mà về cơ bản là một wrapper cho SHChangeNotify cửa sổ chức năng api.

+1

Có vẻ như nó đang giám sát toàn bộ hệ thống tập tin, tôi chỉ có thể giới hạn nó để giám sát các ổ đĩa cứng cục bộ. Có cách nào tôi có thể chỉ định thư mục nó sẽ chỉ theo dõi? Tôi lo rằng nó có thể ăn nhiều tài nguyên không cần thiết. Cảm ơn rất nhiều. – Snackmoore

+0

Tôi không nghĩ rằng bạn có thể, ít nhất là với SHChangeNotify. Tuy nhiên không nên ăn nhiều tài nguyên, bạn sẽ bỏ qua mọi thứ không ảnh hưởng đến con đường bạn quan tâm, cửa sổ sẽ theo dõi tất cả những thay đổi mà bạn đang nghe hay không :) –

0

tôi đề nghị sử dụng 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

Tôi không biết madShell nhưng vòng lặp 'lặp lại đó trông rất xấu xí. Nó liên tục ném và bắt ngoại lệ và có một sự chậm trễ mã hóa cứng ... không phải những gì tôi mong đợi từ một giải pháp sạch sẽ và hiệu quả ... – jpfollenius

Các vấn đề liên quan