2010-08-05 2 views
6

La mia app contiene documenti nel suo database. Gli utenti possono aprire i documenti, nel qual caso il documento viene salvato in una cartella temporanea e viene aperto sul computer dell'utente.Notifica Delphi quando un file viene aggiornato

Desidero ricevere una notifica quando uno di questi file temporanei viene modificato e offrire all'utente il salvataggio del documento modificato nel database.

Qual è il modo più semplice per farlo in Delphi7? (Suppongo che richieda qualche shell magic o componente di terze parti)

Grazie!

+0

Dove sono i documenti caricati? TRichEdit? TMemo? – zz1433

+0

Microsoft Excel – Steve

risposta

4

È possibile:

  1. utilizzare la funzione API Win32 SHChangeNotifyRegister da guardare per i cambiamenti nella cartella Temp, e quindi avere il vostro assegno richiamata se i file temporanei stanno segnalando modifiche.

  2. poiché si conoscono i file esatti a cui si è interessati, è possibile monitorarli manualmente direttamente per le modifiche alle loro dimensioni e ai timestamp utilizzando FindFirstFile in un timer o thread.

8

È possibile rilevare le modifiche nei file temporanei (o qualsiasi file) utilizzando il componente TJvChangeNotify dalla raccolta JEDI JVCL.

+3

Preferisco non utilizzare alcun componente JVCL poiché li ho trovati come pieni di bug. Non parliamo di dover installare componenti di gazilion solo per avere quello di cui hai effettivamente bisogno ... – Steve

4

Oltre a quanto RRuz e Remy Lebeau scritto:

noti che TJvChangeNotify nell'unità JvChangeNotify fa uso della chiamata FindFirstChangeNotification API; this è la documentazione MSDN. Nota che è un po 'contro-intuitivo: vedi il thread di seguito riportato su come usarlo all'interno di un ciclo while.

C'è anche la chiamata ReadDirectoryChanges API, che non è avvolto dal JCL/JVCL, e ha MSDN documentazione here e c'è un Delphi win32 example pure.

This thread spiega le differenze tra le due chiamate API.

--jeroen

+0

Grazie per l'informazione, controlleremo anche questi. – Steve

2
+0

Si prega di notare che c'è un bug in quella libreria. È necessario aggiungere Terminate in TDirWatchThread.Execute (dopo SignalError (ErrorMessage)) - Senza questo entra in un ciclo infinito quando si eliminano tutti i file dalla cartella, quindi la cartella stessa! Passaggi per riprodurre questo bug: creare cartella, monitorare cartella, mettere i file nella cartella, eliminare TUTTI i file dalla cartella, eliminare la cartella, l'app si blocca – Ampere