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

Langage Delphi Discussion :

Utilisation de FindFirst


Sujet :

Langage Delphi

  1. #1
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 82
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut Utilisation de FindFirst
    Bonjour à toutes et à tous

    Envoyé par Linkin en février :
    FindFirst gère le \\ordi\dir\...
    J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    \\MAITRE\REPERTOIRE\BASE.FDB
    \\MAITRE\C:\REPERTOIRE\BASE.FDB
    \\192.168.1.xx\REPERTOIRE\BASE.FDB
    \\192.168.1.xx\C:\REPERTOIRE\BASE.FDB
    et aucun ne me permet de savoir si la base existe.


  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 925
    Points : 6 040
    Points
    6 040
    Par défaut
    Ca dépend peut-être de la version de Delphi

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 115
    Points
    115
    Par défaut
    Salut,

    Heu, pardon, je n'ai peut être pas suivi depuis le début. Mais tu veux dire que tu n'arrives pas a trouver le fichier avec un chemin réseau en utilisant un FindFirst?

  4. #4
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 292
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 292
    Points : 1 944
    Points
    1 944
    Par défaut
    Avec ce code sous Delphi 7, je n'ai pas de souci:

    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
     
    var
      lSearchRecord : TSearchRec;
      lResultat : Integer;
      lFileName: String;
    begin
          lResultat := FindFirst('\\Serveur\Documents\test.jpg',faAnyFile,lSearchRecord);
     
          while lResultat = 0 do
          begin
            if (lSearchRecord.Attr and faDirectory) <= 0 then
            begin
                lFileName := lSearchRecord.Name;
            end;
            lResultat := FindNext(lSearchRecord);
          end;
          SysUtils.FindClose(lSearchRecord);
    Mais si c'est un fichier unique un FileExists devrait suffire, non?

  5. #5
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut

    Citation Envoyé par JP.NUAGE Voir le message
    J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    \\MAITRE\REPERTOIRE\BASE.FDB
    \\MAITRE\C:\REPERTOIRE\BASE.FDB
    \\192.168.1.xx\REPERTOIRE\BASE.FDB
    \\192.168.1.xx\C:\REPERTOIRE\BASE.FDB
    et aucun ne me permet de savoir si la base existe.

    il faut aussi s'assurer que le chemin soit partagé

  6. #6
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Citation Envoyé par evarisnea Voir le message
    il faut aussi s'assurer que le chemin soit partagé
    A la lecture de ce thread c'est bien ce qui me dérange.
    Le dossier dans lequel sont placés tes bases de données n'est pas censé être partagé, surtout pas. Imagine qu'un utilisateur supprime accidentellement une BDD.

    Quelle est la finalité de ce FindFirst ? Si c'est uniquement pour s'assurer de la présence de la base, une simple tentative de connexion fera l'affaire.

    @+ Claudius

  7. #7
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 82
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Et bien, j'ai du boulot pour répondre !

    1) A Jeankiki : exact, je n'arrive pas à trouver de fichier
    2) A Linkin : merci pour la réponse, je vais essayer ton code
    3) A Cl@udius : c'est pour savoir si le fichier existe, en effet, mais ce n'est pas vraiment une base, c'est un backup. Je ne pense donc pas qu'un essai de connexion fasse l'affaire
    4) A evarisnea : toujours pas de flamboyants ? ( C'est un petit clin d'oeil)
    Et enfin
    5) A qi130 : D7 est ma version !

    Merci à tous, je teste avant de clore

  8. #8
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    Citation Envoyé par JP.NUAGE Voir le message
    3) A Cl@udius : c'est pour savoir si le fichier existe, en effet, mais ce n'est pas vraiment une base, c'est un backup. Je ne pense donc pas qu'un essai de connexion fasse l'affaire
    ça pourrait faire l'affaire tu sais, car l'erreur remontée lorsque le fichier n'existe pas :
    Unsuccessful execution caused by a system error that precludes
    successful execution of subsequent statements.
    I/O error for file "C:\FichierQuiNExiste.Pas".
    Error while trying to open file.
    Le fichier spécifié est introuvable.
    est différente de celle remontée lorsque le fichier n'est pas une base de donnée valide :
    Connection authorization failure.File C:\FichierNonBDFirebird.XXX is not a valid database.
    ce qui prouve qu'on peut savoir si oui ou non un fichier existe en essayant de s'y connecter.


    Citation Envoyé par JP.NUAGE Voir le message
    4) A evarisnea : toujours pas de flamboyants ? ( C'est un petit clin d'oeil)
    toujours pas


    tu n'as pas répondu à la question de savoir si le chemin est partagé car je ne pense pas que FindFirst fonctionne sans partage ...

  9. #9
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 82
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Voilà mon code (je vous ai épargné les déclarations) :

    PORTABLE est le nom du Poste SERVEUR, LABTOP est le nom qui apparaît entre parenthèses dans l'Explorateur windows

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       xDate1 := '\\LABTOP\DEDE\GERLOC.FDB'; 
       xDate2 := '\\PORTABLE\DEDE\GERLOC.FDB'; 
       xDate3 := '\\192.168.1.12\DEDE\GERLOC.FDB';
       xExiste1 := FindFirst(xDate1,faAnyFile,xInfo)=0;
       xExiste2 := FindFirst(xDate2,faAnyFile,xInfo)=0;
       xExiste3 := FindFirst(xDate3,faAnyFile,xInfo)=0;
       SysUtils.FindClose(xInfo);
    Dans ce test j'ai fait un essai avec une base Firebird

    Tous les xExiste sont à false.

    Je confirme que le chemin est partagé.

    Je pingue sur 192.168.1.12, et bien sûr par programme, je me connecte à la base



    Et sans vouloir vexer quiconque, tester l'existence par un test sur une erreur ne me satisfait pas beaucoup (mais celà est personnel)

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 115
    Points
    115
    Par défaut
    Salut JP.Nuage,

    Tu devrais essayer le code suivant
    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
     
    var
      sr: TSearchRec;
    begin
      if FindFirst('\\LABTOP\DEDE\*.*', faAnyFile, sr) = 0 then
      begin
        repeat
          if not((sr.Name = '.') or (sr.Name = '..')) then
          begin
            if sr.Name = 'GERLOC.FDB' then
              ShowMessage(sr.Name);
          end;
        until FindNext(sr) <> 0;
      end;
      FindClose(sr);
    end;
    Cependant, fait attention à la CASSE, il semblerait que FindFirst y soit sensible.
    Je viens de faire un test sur un fichier et si je mets tout en majuscule alors qu'il y a des minuscules dans le nom, il ne le trouve pas

    Jeankiki

  11. #11
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 82
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut

    J'ai essayé le code fort aimablement proposé par Jeankiki. J'ai vérifié que tout était en majuscules, je vois bien le fichier par l'explorateur Windows. J'ai fait l'essai avec PORTABLE, LABTOP (NomNetBios) et 192.168.1.12, après vérification grâce à IPSCAN32 des noms et des adresses.

    RIEN

    Je ne rentre même pas dans la boucle de recherche du nom. Seule chose qui a attiré mon attention : lors de l'essai avec LABTOP, le temps de recherche est, me semble-t-il, un peu plus long.

    A désespérer !

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 115
    Points
    115
    Par défaut
    Salut,

    Ou alors tu as un problème de droit sur le dossier ou un firewall qui bloque. As-tu déja essayé de mettre les fichiers en question dans un dossier en local sur ton pc afin de voir s'il trouve le fichier ?
    Ne pourrais-tu pas nous donner la partie de code exacte que tu utilises afin d'y voir plus claire.

    Jeankiki

  13. #13
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 292
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 292
    Points : 1 944
    Points
    1 944
    Par défaut
    As-tu le même résultat en lançant une recherche Windows correspondante au filtre que tu a mis?

  14. #14
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 82
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Pas de problème je mets le code. Je précise que par l'explorateur WINDOWS je vois le fichier. Par IBExpert ou Flamerobin j'accède à la base. Par mon programme je peux aussi accéder à la base. Je viens de vérifier que je peux la traiter. Je me suis aussi assuré en lui donnant un nom unique sur le réseau que je ne lisais pas une base ayant le même nom mais en local (adresse mal codifiée par exemple). Pour le test ce n'est pas celle qui est ouverte par le programme.

    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
    procedure TFRM_Accueuil.FormShow(Sender: TObject);
    var
       xDate1, xDate2 : String;
       xExiste1, xExiste2 : Boolean;
       xInfo : TSearchRec;
    begin
     
       xDate1 := '\\LABTOP\DEDE\GERLOC.FDB';       
       xDate2 := '\\192.168.1.12\DEDE\GERLOC.FDB';    
       xExiste1 := FindFirst(xDate1,faAnyFile,xInfo)=0;
       xExiste2 := FindFirst(xDate2,faAnyFile,xInfo)=0;
       FindClose(xInfo);
       if (not xExiste1) and (not xExiste2) then
          begin
             ToolBar1.Visible := false;
             NouveauDossier.Enabled := false;
             DossierEncours.Enabled := false;
          end;
     
    end;
    Et dans ce code xExiste1 et xExiste2 sont toujours à false. L'adresse 192.168.1.12 est bonne : vérifiée et c'est par elle que j'accède à ma base. La base GERLOC est dans le même répertoire que la base qui me sert pour le programme (\\192.168.1.12\DEDE)

  15. #15
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 974
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 974
    Points : 15 442
    Points
    15 442
    Par défaut
    Salut.

    Mon grain de sel (bon, je vais peut-être dire une grosse bêtise, mais qui ne tente rien...)
    Extrait de l'aide Delphi sur FindFirst :
    FindFirst renvoie 0 si un fichier a été localisé avec succès
    Donc dans ton code, xExiste1 := 0 donc False si FindFirst trouve le fichier...

    Moi j'aurais fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if FindFirst(xDate1,faAnyFile,xInfo)=0 then xExiste1 := True;
    Revois le code de Jeankiki...

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 280
    Points : 41 709
    Points
    41 709
    Billets dans le blog
    64
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Donc dans ton code, xExiste1 := 0 donc False si FindFirst trouve le fichier...

    Moi j'aurais fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if FindFirst(xDate1,faAnyFile,xInfo)=0 then xExiste1 := True;
    non , XExiste1 est bien égal a True si FindFirst=0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     xExiste1 := (FindFirst(xDate1,faAnyFile,xInfo)=0);
    // est la même chose que 
      if FindFirst(xDate1,faAnyFile,xInfo)=0 then xExiste1 := True
                                                                 else xExiste1:=False     ;
    notons que je mets des parenthèse en plus , mais ça ne change rien
    autre chose dans ta proposition où il y a juste :=true , Xexiste1 ne sera pas forcément initialisé à false d'où l'utilisation du else .

    bon, je vais faire un gros effort physique , brancher un hub et démarrer mon vieux pc pour tester ça !

    [EDIT] 7h55
    ma mousse ? pour l'effort

    je viens de tester ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.Button1Click(Sender: TObject);
    var fr : TSearchRec;
        existe : Boolean;
    begin
    if FileExists('\\192.168.0.10\bad\gerloc.fdb') then showmessage('Existe');
    existe:=FindFirst('\\192.168.0.10\bad\gerloc.fdb',faAnyFile	,fr)=0;
    if existe then showmessage('Existe Aussi');
    FindClose(fr);
    end;
    et les deux avec succès

    donc ? quelle particularités as tu ?

  17. #17
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 82
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Bon ENFIN la solution ! Je vais essayer d'être clair et de rendre à chacun ce qu'il a apporté ! Mais d'abord merci à tous

    A) evarisnea a raison avec une précision : le chemin doit être partagé JUSQU'AU REPERTOIRE. Mon disque était bien partagé, mais pas assez.....si j'utilise la codification

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \\192.168.1.12\REPERTOIR\BASE.FDB
    B) Cl@udius peut dormir tranquille : il n'est pas nécessaire de partager le répertoire de la base de donnée à condition de codifier (Merci à SergioMaster) comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \\192.168.1.12\c\REPERTOIRE\BASE.FDB
    mais dans ce cas, le C doit être partagé !

    Remarque : il n'y a pas les : sinon ca ne passe pas

    Et comme l'a dit Sergio Master ceci fonctionne aussi bien par FileExiste que par FindFirst

  18. #18
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 280
    Points : 41 709
    Points
    41 709
    Billets dans le blog
    64
    Par défaut
    petite erreur de ta part , si tu partage C:\ ainsi que les sous répertoires
    alors la base peut toujours être détruite et Cl@udius a raison ,
    une Base de Donnée en réseau ne devrait pas se trouver dans un répertoire partagé

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

Discussions similaires

  1. Utilisation de FindFirst dans la Base de Donnée
    Par vodiv dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/06/2008, 14h52
  2. Comment je peux utiliser Findnext FindFirst
    Par zizo89 dans le forum Delphi
    Réponses: 5
    Dernier message: 17/05/2007, 17h19
  3. comment utiliser Findfirst et FindNext
    Par oumarsaw dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 18/04/2006, 12h48
  4. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 13h36
  5. Réponses: 2
    Dernier message: 21/03/2002, 00h01

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