Question

Est-il possible d'ouvrir un fichier texte et lire le contenu pendant qu'une autre application est mise à jour du fichier, de telle sorte qu'il ne provoque pas de conflit de verrouillage?

Je dois surveiller un fichier journal d'une application qui est mis à jour par une autre application à chaque fois qu'un événement se produit.

Je vérifie si le fichier est utilisé avant d'essayer de le lire, mais cela ne semble pas fonctionner dans tous les cas.

Merci, Pieter

Était-ce utile?

La solution

il dépend de la façon dont la première application ouvrir ce fichier.

i.e. lors de l'appel API CreateFile pour ouvrir un fichier, il y a dwShareMode qui indique au param api comment l'ouvrir (si cela a été donné 0, il ne peut pas être accessible à partir d'autres applications IIRC). sinon il devrait y avoir aucun problème avec la lecture de ce fichier. si je ne suis pas trompé, pour vérifier si ce fichier est en cours d'ouverture en lecture seule u peut appeler quelque chose comme

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

Autres conseils

  1. Télécharger Process Monitor de Sysinternals.
  2. Ouvrez la boîte de dialogue de filtre et ajouter un filtre « chemin » pour votre fichier journal.
  3. Lancez l'application du journal écrit (je vais appeler cette "LogWriter").
  4. Rechercher et cliquez sur l'événement où LogWriter fait un CreateFile.
  5. Sous la rubrique « Détail », il devrait avoir « Desired Accès: Écriture générique ». Et il devrait avoir « ShareMode: Read », ce qui correspond à FILE_SHARE_READ dans l'appel à CreateFile. Ce que cela signifie est, "Je, LogWriter, permettre aux autres de lire mon dossier".
  6. Maintenant, exécutez votre application journal de lecture ( "LogReader"), et faire le même exercice.
  7. Le détail devrait avoir « Desired Accès: lecture générique ». Et il devrait avoir. « ShareMode: lecture, écriture », ce qui signifie: « Moi, LogReader, permettre à d'autres, y compris LogWriter, à lire et à écrire dans le fichier journal »

Ce sont les valeurs les plus sensibles, je pense, et ils empêcheront le verrouillage. D'autres combinaisons peuvent être autorisées. Il est une table .

Maintenant, vous avez pas dit ce qui se passe quand il « ne semble pas fonctionner dans tous les cas ». Que faire ensuite va vraiment dépendre des détails. Espérons que ce qui précède vous donnera suffisamment d'informations pour déterminer ce qui ne va pas.

Vous n'obtiendrez un conflit de verrouillage car l'application d'écriture est très peu probable d'avoir verrouillé le fichier. Faire ce que vous suggérez fonctionne généralement sans problème (il est ce que l'UNIX tail -f fait) et les petits problèmes qui surviennent peuvent être ignorés. J'ai écrit quelques applications de surveillance du journal dans te passé qui a travaillé comme ça, sans problème.

Essayez d'utiliser FileSystemWatcher pour obtenir des événements lorsque un fichier est mis à jour.

A plus delphi href="http://www.delphibasics.co.uk/NameSpace.asp?Name=System.IO&Part=FileSystemWatcher" friendly

En dehors d'obtenir le partage de fichiers au travail droit qui peut être impossible selon ce que les autres demandes du programme, certains programmes fermeront le fichier entre les accès.

Je l'ai eu du succès dans le passé avec mon programme en attendant le fichier soit disponible, puis en ouvrant rapidement, en saisissant les données nécessaires et la fermer. Au moins dans DOS une tentative d'accéder à un fichier verrouillé causé quelques relances, et je cogné ce paramètre, de sorte que si l'autre programme jugé pour le dossier alors que je l'avais, ils seraient tout simplement retardée et ne voient jamais une erreur.

J'ai même pu mettre à jour le fichier (je me suis assuré PAS pour la fermer entre les deux!) Sans l'autre programme jamais connaître une chose.

laid comme le péché, mais nous ne pouvions pas changer l'autre programme il était le seul moyen de faire le travail. Il a été déployé en interne depuis des années, je ne ai jamais entendu un seul bruit des utilisateurs de ce système. Elle a finalement a disparu quand a été retiré l'appareil contrôle l'autre programme.

XpoLog fera l'affaire sans changer votre env ou code, XpoLog moniteur journal

Avar est juste - vous êtes à la merci du programme d'écriture ici. Si elles sont verrouillent le fichier, puis il y a quelques choses que vous pouvez faire:

1 - Vérifier changement dans le temps de la date "Dernière modification" -. si cela change, alors vous savez quelque chose est arrivé

2 - Si le datetime mod a changé, puis (en fonction de la taille du fichier), il pourrait être assez bon pour créer une copie du fichier et vérifier

.

nous utilisons "la queue pour win32",

Je sais que ce ne est pas delphi, mais il pourrait être utile

http://tailforwin32.sourceforge.net/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top