IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Est-il possible de détecter la modification d'un fichier ?


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre du Club Avatar de Kokito
    Homme Profil pro
    Inscrit en
    Février 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2004
    Messages : 78
    Points : 56
    Points
    56
    Par défaut Est-il possible de détecter la modification d'un fichier ?
    Bonjour tout le monde

    Pfffiouu,ca f'sait longtemps que j'étais pas passé par ici

    Alors voilà mon chtit problème


    J'ai un fichier texte généré automatiquement par un programme en VB, malheureusement, on a pas les sources. (D'un côté je préfère, j'aime pas du tout utilisé VB et SQL, je trouve que ca va pas trop ensemble ).

    Voilà donc, j'aimerais qu'à chaque fois que ce fichier texte est modifié, delphi lise la dernière ligne de ce fichier et l'ajoute dans une base SQL.


    Je voudrais savoir si il est possible de détecter cette modification de fichier ? Si oui comment ?

    Merci de votre aide

    Et bon appétit à ceux qui vont manger
    Protégeons la couche d'eau jaune

  2. #2
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    C'est faisable, il y a des logiciels qui le font mais je ne sais pas comment.

    Je suppose que tu pourrais sélectionner dans ton appli un répertoire à surveiller, puis périodiquement tu verifierai la présence ou non de nouveau fichier ainsi que la date de dernière modification...

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    L'API que tu cherches est probablement FindFirstChangeNotification :
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/findfirstchangenotification.asp

    La JVCL encapsule tout cela très simplement avec le composant TJvChangeNotify.
    "It's more fun to compute !"

  4. #4
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 103
    Points : 120
    Points
    120
    Par défaut
    Salut,

    plus simplement ne serait-il pas possible de travailler sur la Date/Heure du fichier ? Si il est modifier cette dernière doit l'être aussi...

    mais c'est peut-être pas suffisant dans ton cas...

    @+
    Ce n'est pas parce qu'on pédale dans la semoule, qu'on est sûr de manger du couscous... (anonyme)

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    plus simplement ne serait-il pas possible de travailler sur la Date/Heure du fichier ? Si il est modifier cette dernière doit l'être aussi...
    Cela oblige à faire une boucle qui scrute en permanence la date de modification du fichier alors que des API sont fait pour ça.

    Ceci dit, ca doit très bien marcher...
    "It's more fun to compute !"

  6. #6
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    Points : 21
    Points
    21
    Par défaut
    Je sais pas si ca peut t'aider, mais pour mes petits besoins personnels, j'avais fait un programme qui surveillait la modification d'un fichier texte.
    (http://www.developpez.net/forums/vie....php?t=208639)
    En fait comme l'a dit Reisubar, je suis passé par une surveillance en permanence (en fonction du timer, le mien c'était toute les 2sc) le fichier, je comptais et mémorisais le nombre de ligne, et comme ca je pouvais detecter si une nouvelle ligne avait été ajoutée.
    Et puis le prog balancait la nouvelle ligne dans un Memo

  7. #7
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Si tu tournes sur NT/2000/XP ( sous NTFS ), je te conseilles plutôt la fonction Api ReadDirectoryChangesW.

    Voir : http://nono40.developpez.com/sources/source0045.html

    L'avantage de cette fonction est de donner directement le nom du fichier modifié. Tu n'as pas besoin de surveiller les dates.

    Si tu veux le faire avec la fonction FindFirstChangeNotification, voir ici :
    http://nono40.developpez.com/sources/source0017.html
    http://nono40.developpez.com/sources/source0018.html
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  8. #8
    Membre du Club Avatar de Kokito
    Homme Profil pro
    Inscrit en
    Février 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2004
    Messages : 78
    Points : 56
    Points
    56
    Par défaut
    Merci à tous de votre aide, je vais zieuter toute l'aide que vous m'avez fourni

    Encore merci
    Protégeons la couche d'eau jaune

  9. #9
    Membre du Club Avatar de Kokito
    Homme Profil pro
    Inscrit en
    Février 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2004
    Messages : 78
    Points : 56
    Points
    56
    Par défaut
    Bon voilà j'ai trouvé la solution à mon problème grâce à vous, encore merci

    Je suis bloqué devant un autre problème maintenant

    Je sais pas trop comment faire pour lire la dernière ligne d'un fichier texte

    Quelle méthode vous me conseilleriez ?


    Ensuite les lignes dans ce fichier sont comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    38108,02859	17,4	95,8	453,0
    Je voudrais juste récupérer les 3 derniers nombres et les caser dans 3 variables différentes. Je devrais mieux le faire pendant que je lis dans le fichier ou après que j'ai récupéré toute la ligne ?

    Merci de votre aide
    Protégeons la couche d'eau jaune

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    Pour la dernière ligne, tu peux charger ton fichier dans une TStringList et lire la dernière ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dernière := MaStringList[MaStringList.Count-1];
    Ensuite tu fais ton travail sur les chaînes avec la variable contenant cette dernière ligne.
    "It's more fun to compute !"

  11. #11
    Membre du Club Avatar de Kokito
    Homme Profil pro
    Inscrit en
    Février 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2004
    Messages : 78
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par Reisubar
    Pour la dernière ligne, tu peux charger ton fichier dans une TStringList et lire la dernière ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dernière := MaStringList[MaStringList.Count-1];
    Ensuite tu fais ton travail sur les chaînes avec la variable contenant cette dernière ligne.

    Merci ca marche impecc ...

    Maintenant, j'ai des fichiers qui peuvent avoir plus de 280 000 lignes, comme celle que j'ai cité, c'est pas trop fréquent mais quand même.

    Bref j'ai testé avec un gros fichier de 280 000 lignes donc ca fait 5 minutes que j'ai fait le LoadFromFile et le prog tourne encore dans la semoule ... ah ca y est, le prog a affiché tout le fichier au bout de 6 minutes et 54 secondes

    Y'a t-il une méthode qui permette d'ouvrir le fichier et d'aller directement à la dernière ligne sans être obligé d'ajouter toutes les lignes dans un TStringList ou autres ?

    Promis après j'arrête de vous embêter
    Protégeons la couche d'eau jaune

  12. #12
    Membre du Club Avatar de Kokito
    Homme Profil pro
    Inscrit en
    Février 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2004
    Messages : 78
    Points : 56
    Points
    56
    Par défaut
    Voilà, j'ai trouvé une solution qui fonctionne en 2 secondes pour un fichier de 300 000 lignes.

    Je fais un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    repeat 
    Readln(F,Ligne); 
    until EOF(F);
    ListBox1.Items.Add(Ligne);
    Je sais pas si c'est la bonne méthode mais en tout cas, ca fonctionne rapidement

    Merci à tous de votre aide
    Protégeons la couche d'eau jaune

  13. #13
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut Une autre idée
    Je pense avoir une autre idée : utiliser les flux. Essaie ceci, ça devrait fonctionner et ne durer que quelques nanosecondes pour n'importe quelle taille de fichier.
    La fonction ne teste pas si le fichier a été modifié.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    function DerniereLigne(NomFichier : string) : string;
    var Fichier : TFileStream;
        C : Char;
    begin
      Fichier := TFileStream.Create(NomFichier, fmOpenRead or fmDenyNone);
      Fichier.Seek(-1, soFromEnd);
      Fichier.Read(C, 1);
      if C = #10 then
      begin
        Fichier.Seek(-2, soFromCurrent);
        Fichier.Read(C, 1);
        if C = #13 then Fichier.Seek(-2, soFromCurrent)
                   else Fichier.Seek(-1, soFromCurrent);
      end else Fichier.Seek(-1, soFromCurrent);
      // Maintenant, la position du fichier est au dernier caractère
      // de la chaîne, qu'elle se termine par #13#10, #10 ou rien.
      Result := '';
      repeat
        Fichier.Read(C, 1);
        Fichier.Seek(-2, soFromCurrent);
        if C <> #10 then Result := C+Result;
      until C = #10;
      Fichier.Free;
    end;
    Cette fonction part de la fin du fichier et lit caractère par caractère en arrière jusqu'à trouver un #10 marquant la fin de la chaîne précédente.
    Ajouter l'unité Classes à la clause Uses
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  14. #14
    Membre du Club Avatar de Kokito
    Homme Profil pro
    Inscrit en
    Février 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2004
    Messages : 78
    Points : 56
    Points
    56
    Par défaut
    Cool merci, je vais essayer ça tout de suite
    Protégeons la couche d'eau jaune

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/02/2015, 16h31
  2. Réponses: 3
    Dernier message: 31/01/2008, 16h42
  3. Réponses: 1
    Dernier message: 24/05/2007, 17h54
  4. La modification du vote (étoile) du sujet est-elle possible ?
    Par pottiez dans le forum Evolutions du club
    Réponses: 1
    Dernier message: 04/05/2006, 21h48
  5. Est-il possible d'exécuter une fonction à partir de fichier
    Par magic8392 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 16/09/2005, 13h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo