Domanda

È è possibile aprire un file di testo e leggere il contenuto mentre un'altra applicazione sta aggiornando il file, in modo tale da non causare un conflitto di blocco?

Ho bisogno di controllare un file di log da un'applicazione che viene aggiornata da un'altra applicazione ogni volta che si verifica un evento.

Io controllo se il file è in uso prima di provare a leggerlo, ma questo non sembra funzionare in tutti i casi.

Grazie, Pieter

È stato utile?

Soluzione

dipende da come la prima applicazione aprire il file.

vale a dire quando si chiama CreateFile API per aprire un file, c'è param dwShareMode che racconta l'API come aprirlo (se questo è stato dato 0, non è possibile accedere da altre applicazioni IIRC). altrimenti non ci dovrebbero essere problemi con la lettura da quel file. se im non sbaglio, per verificare se il file viene aperto in sola lettura u può chiamare qualcosa come

CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ;

Altri suggerimenti

  1. Download Process Monitor da Sysinternals.
  2. Aprire la finestra di filtro e aggiungere un filtro "percorso" per il file di log.
  3. Avviare l'applicazione di registro di scrittura (che chiamerò questo "logwriter").
  4. Cercare e fare clic sul evento in cui logwriter fa un CreateFile.
  5. In "Dettaglio", dovrebbe avere "accesso desiderato: Write generico". E dovrebbe avere "ShareMode: Read", che corrisponde alla FILE_SHARE_READ nella chiamata a CreateFile. Che cosa significa è, "Io, logwriter, permettere ad altri di lettura il mio file".
  6. Ora eseguire l'applicazione log-lettura ( "logreader"), e fare lo stesso esercizio.
  7. Il dettaglio dovrebbe avere "accesso desiderato: Lettura generica". E dovrebbe avere "ShareMode: lettura, scrittura", che significa: "Io, logreader, permettere ad altri, tra cui logwriter, per leggere e scrivere il file di log"

Questi sono i valori più ragionevoli, penso, e saranno prevenire la chiusura. Altre combinazioni possono essere ammessa. Ci è una tabella qui .

Ora, non hai detto che cosa accade quando "non sembra funzionare in tutti i casi". Operazioni successive sarà davvero dipenderà dai dettagli. Speriamo che quanto sopra vi darà informazioni sufficienti per capire cosa sta andando male.

Non sarà possibile ottenere un conflitto di blocco in quanto l'applicazione di scrittura è molto improbabile che hanno bloccato il file. Facendo quello che suggeriscono in generale funziona senza problemi (è ciò che l'UNIX tail -f il comando fa) e quei piccoli inconvenienti che si verificano possono essere ignorati. Ho scritto un paio di applicazioni di monitoraggio log in te passato, che ha lavorato in questo modo, senza problemi.

Prova a usare FileSystemWatcher per ottenere eventi quando un file viene aggiornato.

Un altro Delphi amichevoli

Al di là di ottenere il file sharing di lavorare destra che potrebbe non essere possibile a ciò che le altre richieste del programma, alcuni programmi chiudere il file tra gli accessi.

Ho avuto successo in passato con il mio programma in attesa che il file diventi disponibile, poi rapidamente aprirlo, afferrando i dati necessari e chiusura. Almeno in DOS tentativo di accedere a un file bloccato ha causato un paio di tentativi, e ho urtato questa impostazione, in modo che se l'altro programma processato per il file mentre ho avuto si sarebbero semplicemente essere in ritardo e non vedere mai un errore.

Sono stato anche in grado di aggiornare il file (ho fatto in modo non per chiuderla in mezzo!) Senza l'altro programma mai sapere una cosa.

brutto come il peccato, ma non siamo riusciti a cambiare l'altro programma così è stato l'unico modo per ottenere il lavoro fatto. E 'stato implementato in-house per anni, non ho mai sentito un bip dagli utenti di tale sistema. E, infine, è andato via quando la macchina l'altro programma controllato è stato ritirato.

XpoLog farà il trucco senza cambiare il tuo env o il codice, XpoLog monitor di log

Avar è giusto - si è in balia del programma di scrittura qui. Se sono il blocco del file, poi ci sono un paio di cose che puoi fare:

1 - Verificare la presenza di un cambiamento nella "ultima modifica" data -. se questo cambia, poi si sa qualcosa è successo

2 - Se il datetime mod ha fatto il cambiamento, allora (a seconda della dimensione del file) potrebbe essere sufficiente per creare una copia del file e verificare che

.

usiamo "Coda per win32",

So che la sua non Delphi ma potrebbe essere utile

http://tailforwin32.sourceforge.net/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top