2010-03-27 11 views
5

Devo generare un evento quando un file viene chiuso da un'altra app.Monitora file simili a File Internal/System Monitor/Monitor di Microsoft

Sfortunatamente, ReadDirectoryChangesW non segnala l'evento di chiusura. Sarebbe possibile per me eseguire il polling (con un TTimer) di qualsiasi file segnalato da ReadDirectoryChangesW come modificato, in attesa che venga chiuso (utilizzando CreateFile per rilevare ciò).

Tuttavia, ciò che preferirei è una soluzione completamente guidata dagli eventi.

C'è un modo per agganciare le chiamate di sistema e rilevare tutti gli eventi di chiusura dei file? Voglio semplicemente conoscere il percorso & nome di qualsiasi file che è stato appena chiuso.

+1

Avete qualche idea del perché le modifiche alla directory oggetto non ti dà l'evento? Questo dovrebbe funzionare normalmente senza alcun hickup su qualsiasi unità locale e rimovibile (e più spesso anche su qualsiasi unità di rete). Hai mai provato le routine di notifica di modifica dell'esploratore: SHChangeNotifyRegister? –

+1

Non vuole rilevare l'handle del file che viene chiuso, non il file da eliminare. ReadDirectoryChangesW non fornisce quell'evento. – Runner

risposta

7

Non esiste una soluzione semplice per il problema in Delphi da solo - la vera soluzione è scrivere un filter driver per monitorare gli eventi di chiusura dei file.

5

Si dovrebbe dare un'occhiata a Mathias Rauens madCodeHook:

madCodeHook offre tutto il necessario agganciare il codice (per lo più le API) in tutti i 32 e 64 bit di Windows sistemi operativi da Windows 95 a Windows 7 Puoi scegliere se vuoi agganciare le API nel tuo processo, o in uno specifico processo di destinazione , o in tutto il sistema.

-1

All'interno Jedi Code Library (JCL), si dispone di un componente denominato 'TJvChangeNotify' dove è possibile ottenere la notifica quando è stato rilevato un cambiamento in una directory monitorata:

  • cambiato ' Ultima scrittura ' => Quindi sembra essere la cosa esatta che volevi fare!

Altre cose che può fare:

  • formato file modificato
  • Cambiato il nome del file ...

E meglio di tutti, è cercare all'interno di una cartella con le sottodirectory se tu vuoi. Ecco un collegamento a (parte di) file di aiuto per questo componente: http://help.delphi-jedi.org/item.php?Id=172982

Spero che questo possa essere d'aiuto.

+0

La domanda menziona specificamente perché questo non è ciò che OP sta cercando. – mghie

+0

-1: dichiarato chiaramente che questa non era un'opzione. –

+0

Non c'è bisogno di essere così difficile. La domanda termina con "Voglio semplicemente sapere il percorso e il nome di qualsiasi file che è stato appena chiuso", così ho provato a rispondere :) – TridenT

0

Se le notifiche di modifica non funzionano, è possibile utilizzare un metodo molto grezzo e zoppo: il polling. Ogni secondo circa, prova ad aprire il file con alcune opzioni di condivisione incompatibili. Nel momento in cui questo succede, sai che l'altra applicazione l'ha chiusa.

Non è l'opzione più pulita di gran lunga, ma funzionerà. Questa è solo un'opzione se è necessario monitorare un numero limitato di file e i loro nomi sono noti in anticipo.

+0

Questo è menzionato nella domanda come una possibile soluzione (lame), quindi perché ripeterlo? – mghie

+1

Ho appena affermato l'ovvio, forse, ma penso che i pro e gli impedimenti del pro non siano stati menzionati. Ecco perchè. –

+0

Non parli di impossibilità. È possibile monitorare un numero illimitato di file in questo modo, i cui nomi non devono essere conosciuti in anticipo, e l'OP lo dice nella sua domanda. Non si menziona la vera limitazione, cioè che questo potrebbe interferire con altri programmi (può causare la mancata riapertura dei file guardati). – mghie

Problemi correlati