CAA File library : list dir

galexis
2022-02-02
2022-02-04
  • galexis - 2022-02-02

    Hi,
    could you help me to use FILE.DirList of CAA file library ?
    I would like to list all files of directory.
    When directory is open with FILE.DirOpen, I want to store all information on table myList ARRAY [0..10] OF FILE.FILE_DIR_ENTRY .

    When function return xDone and eError<>5106 I increase address in table.
    But I never have eError=5106 and I only store information of first file.

    Could you help me ?

    PROGRAM Prg_FichierLocal
    VAR
        FB_OuvrirRepertoire: FILE.DirOpen;
        FB_ListerFichier: FILE.DirList;
        FB_FermerRepertoire: FILE.DirClose;
        stListeFichier: ARRAY [0..10] OF FILE.FILE_DIR_ENTRY;
        xExecuter: BOOL;
        xInit: BOOL;
        sCheminRepertoire: STRING := '/';
        hDir : CAA.HANDLE;
        uiEtape: UINT;
        uiNombre: UINT;
    END_VAR
    
    FB_OuvrirRepertoire(
        sDirName:= sCheminRepertoire,
        xExecute:= (uiEtape=0));
    
    FB_ListerFichier(
        hDir:=hDir,
        xExecute:=(uiEtape=1));
    
    FB_FermerRepertoire(
        hDir:= hDir,
        xExecute:= (uiEtape=2));
    
    IF xExecuter=FALSE THEN
        uiEtape:=5;
        FB_OuvrirRepertoire.xExecute:=FALSE;
        FB_ListerFichier.xExecute:=FALSE;
        xInit:=FALSE;
    ELSE
        IF xInit=FALSE THEN
            uiEtape:=0;
            xInit:=TRUE;
            uiNombre:=0;
        END_IF
    END_IF
    
    CASE uiEtape OF
    
        0: (*Ouvrir le répertoire*)
            IF FB_OuvrirRepertoire.xDone=TRUE THEN
                hDir := FB_OuvrirRepertoire.hDir;
                uiEtape:=1;
                uiNombre:=0;
            END_IF
            IF FB_OuvrirRepertoire.xError=TRUE THEN
                FB_OuvrirRepertoire.xExecute:=FALSE;
            END_IF
    
    
        1:  (*Lister les fichier du répertoire*)
    
            IF FB_ListerFichier.xDone=TRUE AND FB_ListerFichier.eError<>5106THEN
                stListeFichier[uiNombre].xDirectory:=FB_ListerFichier.deDirEntry.xDirectory;
                stListeFichier[uiNombre].szSize:=FB_ListerFichier.deDirEntry.szSize;
                stListeFichier[uiNombre].sEntry:=FB_ListerFichier.deDirEntry.sEntry;
                stListeFichier[uiNombre].dtLastModification:=FB_ListerFichier.deDirEntry.dtLastModification;
                stListeFichier[uiNombre].xExclusive:=FB_ListerFichier.deDirEntry.xExclusive;
                uiNombre:=uiNombre+1;
    
                IF FB_ListerFichier.xDone=TRUE AND FB_ListerFichier.eError=5106 THEN
                    uiEtape:=2;
                END_IF
            END_IF
    
            IF FB_ListerFichier.xError THEN
                uiEtape:=0;
            END_IF
    
    
        2:  (*Fermer le répertoire*)
    
            IF FB_FermerRepertoire.xDone THEN
                FB_FermerRepertoire.xExecute:= FALSE;
                uiEtape:=0;
            END_IF
            IF FB_FermerRepertoire.xError THEN
                FB_FermerRepertoire.xExecute:= FALSE;
                uiEtape:=0;
            END_IF
    
    END_CASE
    
     
  • dFx

    dFx - 2022-02-02

    Did you tried to change execute flag of "FB_ListerFichier" while you are in step 1 ?

     
  • galexis - 2022-02-02

    Sorry, i don't understand what you mean... You spek about input xExecute of function ?

     
  • dFx

    dFx - 2022-02-02

    Yes, just make it 1->0->1 once to get the next results.

    -- Frog eaters mode ON
    Etant donné que le bloc ne sort qu'un seul résultat à la fois, il faut donc indiquer au bloc de donner le résultat suivant.
    Dans l'exemple que vous avez adapté, aucune entrée du bloc n'est modifiée, comme si le bloc modifiait ses sorties à chaque appel.
    Or dans le cadre d'opérations avec un système de fichiers, elles sont asynchrones, donc ce cas est a priori exclu.

     

    Last edit: dFx 2022-02-02
  • galexis - 2022-02-02

    Every each finded files generate rising xDone output ?

     

    Last edit: galexis 2022-02-02
  • galexis - 2022-02-02

    Could you help me to modifie my code ?

     
  • dFx

    dFx - 2022-02-02
    FB_ListerFichier(
        hDir:=hDir,
        xExecute:=(uiEtape=1) AND (NOT FB_ListerFichier.xDone OR FB_ListerFichier.eError=5106));
    
     
  • galexis - 2022-02-02

    Thank you very much !

     
  • galexis - 2022-02-02

    After make list of files and directory: I have to close directory ?

     
  • dFx

    dFx - 2022-02-02

    even on error of list, you should close it always.
    by the way, the exemple you use does it almost correctly.

     
  • galexis - 2022-02-03

    How to test if directory exist ? With DirOpen : when directory doesn't exist it return UNKNOW ERROR....
    Thank you very much.🐸

     
  • dFx

    dFx - 2022-02-04

    This question, even related to your first one, should be split in another topic, as it is different from you first one.

     

Log in to post a comment.