Forum Liberty Basic France

Débutant » [Réglé] Comment fonctionne FILES ??? erreur "system primitive failed"
Le 21/07/2017 à 20h09

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 516
J'ai voulu connaitre le contenu d'un dossier avec l’instruction FILES

Le cheminement :
  • compilation arrêtée par une erreur "system primitive failed"
  • ajout d'un "on error goto" permettant de sauter les cas ou se produit l'erreur, permet de savoir qu'il s'agit toujours de l'erreur "Subscript out of range"
  • lorsqu'il n'y a pas d'erreur, le nombre de fichiers dans le dossier et le chemin du dossier sont corrects, mais tout le reste se limite à la lettre "a"


Les questions :
  • Pourquoi subscript out of range puisque le tableau info$() est bien dimensionné à (10,10) et que les valeurs des index ne sortent pas de cette gamme ???
  • Pourquoi "a", alors qu'on aurait dû trouver les nom, date et taille des fichiers contenus dans le dossier ?...


Pour l’instant, je sèche lamentablement...

Voici le code :
Code VB :
 
 
'   lister le contenu d'un dossier

'choisir un fichier dans le dossier qu'on désire analyser
FILEDIALOG "Choisir un fichier de la base de données :", "*.*", fichier$
print fichier$
print
 
'déterminer le nom du dossier en retirant du chemin le nom du fichier sélectionné
fin=0
a=len(fichier$)
posit=0
while fin<>1
    if mid$(fichier$,a,1)="\" then posit=len(fichier$)-a:fin=1
    a=a-1
    if a<0 then fin=1:stopper=1
wend
 
if stopper=1 then print "pas de barre de fraction inversée":end
 
dossier$=left$(fichier$,len(fichier$)-posit)
print dossier$
print
 
if dossier$<>"" then
 
    'chargement des informations sur le dossier dans le tableau info$()
    dim info$(10,10)
    files dossier$, info$()
 
    'lecture exhaustive du contenu du tableau
    for a=0 to 9
        for b=0 to 9
 
            on error goto [passe_par_dessus]
            a$=info$(a,b)
 
           [passe_par_dessus]
            if Err<>0 then
                print "index 1 = ";a;", index 2 = ";b;", erreur ";Err;" : ";Err$
            else
                print "index 1 = ";a;", index 2 = ";b;", info$(";a;",";b;") = ";a$
            end if
 
        next
        print
    next
 
else
    print "pas de fichier sélectionné, fin du programme"
end if
 
end
 
 




Edité par Christophe Le 21/07/2017 à 20h11
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 21/07/2017 à 22h05

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2083
Il faut mettre le "dim tableau" en tête de gondole.
Mets le juste après le "nomainwin" pour être sûr
____________________
Roro

   
Le 22/07/2017 à 01h12

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 516
Bien essayé (le spectre du fonctionnement différent entre mode normal et débugage ? ;) ) mais ça n'a rien changé...

Par contre, j'ai repris le problème en me conformant strictement au fichier d'aide, en ne récupérant que les valeurs du tableau qu'il cite, et là, miracle, et crois-moi si tu veux, ça fonctionne. Puis je l'ai un peu adapté pour le code en bas du post, et ça marche toujours...

Donc un tableau qui recense les données d'un dossier ne fonctionne pas comme un tableau classique.

Dans le tableau qui reçoit les données du dossier :
  • le premier index à zéro donne les infos du dossier (nombre de fichiers, de dossiers, lettre du lecteur, chemin.
  • Le premier index à 1 donne les infos du premier fichier, à 2 donne celles du second, à 3 du troisième, etc...
  • Un tableau normal nous gratifierait d'un magnifique subscript out of range lorsque nous atteindrions le dixième fichier (puisque le tableau est dimensionné à (10,10), or, le programme a listé sans broncher les 22 fichiers contenus dans le dossier testé.
  • lire ce tableau comme on lirait un tableau classique amène les résultats délirants qu'on a pu constater sur le listing précédent

Je respire, je t'avouerais que tous ces dysfonctionnements commençaient à me décourager, mais, hormis pour l' actuellement inexplicable différence entre le lancement normal et en mode animate, les bugs que j'ai rencontré au fil du temps étaient toujours dûs à ma programmation...

Code VB :
 
 
'   lister le contenu d'un dossier

'choisir un fichier dans le dossier qu'on désire analyser
FILEDIALOG "Choisir un fichier de la base de données :", "*.*", fichier$
print fichier$
print
 
'déterminer le nom du dossier en retirant du chemin le nom du fichier sélectionné
fin=0
a=len(fichier$)
posit=0
while fin<>1
    if mid$(fichier$,a,1)="\" then posit=len(fichier$)-a:fin=1
    a=a-1
    if a<0 then fin=1:stopper=1
wend
 
if stopper=1 then print "pas de barre de fraction inversée":end
 
dossier$=left$(fichier$,len(fichier$)-posit)
print dossier$
print
 
 
 
 
if dossier$<>"" then
 
    'chargement des informations sur le dossier dans le tableau info$()
    dim info$(10,10)
    files dossier$, info$()
 
    'lecture des infos du dossier
    NbFic=val(info$(0, 0)):print "Fichiers trouvés : ";NbFic
    NbDos=val(info$(0, 1)):print "Dossiers trouvés : ";NbDos
    Lett$=info$(0, 2):print "Lettre du disque : ";Lett$
    chem$=info$(0, 3):print "Chemin du dossier : ";chem$
 
    'lecture des infos des fichiers
    for a=1 to NbFic
        print
        print info$(a, 0)	'nom
        print info$(a, 1)	'taille
        print info$(a, 2)	'heure et date
    next
 
end if
end
 
 




Edité par Christophe Le 22/07/2017 à 01h14
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 22/07/2017 à 09h13

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2083
Cassiope a fait un explorateur de dossiers et j'en ai fait un aussi à ma sauce, je vais tenter de les retrouver. :hum
Edit: Voici celui de Cassiope issu de chez les anglophones:
Code VB :
 
' Mark Parkinson
' 08/10/02

' This program will list all the files in the whole directory structure
' which match the given file spec. A process called recursion is used.

' Feel free to use and adapt the program eg to sum the filespace used or
' delete files or rename files or move them.
' It is also easy to adapt the program to delete empty subdirectories.

' http://justbasic.wikispaces.com/Folder+Dialog
'Folderdialog by UncleBen

 
global nfiles, thingtohuntfor$
dim info$(1,1)  'Ready for the files command.
dim FolderDlg$(10)
 
placetohunt$ = JBFolderDialog$() '"C:\JUST BASIC"
'thingtohuntfor$ = "*.bas"
if placetohunt$ = "" then placetohunt$ = "c:\"
mess$ = "now listing all files in  ";placetohunt$;"..   which match ";thingtohuntfor$
confirm mess$;answer$
If answer$ = "no" then end
 
print "All files in ";placetohunt$;" which match ";thingtohuntfor$
print
print "Search..."
call recurse placetohunt$, thingtohuntfor$
print
print "finished.  (";nfiles;" files)"
 
 
sub recurse pathspec$,mask$
    'Put in the backslash separator.
    if right$(pathspec$,1)<>"\" then pathspec$=pathspec$+"\"
    files pathspec$, mask$, info$(
 
    filecount=val(info$(0, 0))
    subdircount=val(info$(0, 1))
 
    for i=1 to filecount
        filename$= pathspec$+info$(i, 0)
        filesize$= info$(i, 1)
        datestamp$=info$(i, 2)
        print filename$,,,filesize$,,,datestamp$
        nfiles = nfiles + 1
    next i
 
'Arrays cannot be local to subs so the subdirs
'are all put in a string separated by *'s which
'can't occur in filenames.
    list$=""
    for i=1 to subdircount
        list$=list$+pathspec$+info$(f + i, 1)+"*"
    next i
'The subdirs are now pulled out of the (local)
'string one at a time and the sub is called again.
'This process where a sub calls itself
'is called recursion.
    while list$<>""
        p=instr(list$,"*")
        p$=left$(list$,p-1)
        call recurse p$,mask$ 
        list$=mid$(list$,p+1)
    wend
end sub
 
function JBFolderDialog$()
    level = 1
    path$ = ""
    folder$ = ""
    doubleClick = 0
    call ReadDrives
 
    WindowWidth = 272
    WindowHeight = 295
    UpperLeftX = Int((DisplayWidth - WindowWidth) / 4)
    UpperLeftY = Int((DisplayHeight - WindowHeight) / 4)
    button #folderdlg.default, "OK", [FolderOk], UL, 30, 216, 96, 25
    button #folderdlg, "Cancel", [FolderCancel], UL, 134, 216, 96, 25
    listbox #folderdlg.lb, FolderDlg$(, [SelectFolder], 22, 11, 216, 160
    textbox #folderdlg.tb, 22, 186, 170,25
    textbox #folderdlg.ex, 210, 186, 40,25
    open "Choose Folder" for dialog_modal as #folderdlg
    #folderdlg, "trapclose [FolderCancel]"
    #folderdlg.lb, "singleclickselect"
    #folderdlg.ex, "!setfocus"
    wait
 
    [SelectFolder]
    #folderdlg.lb, "selection? a$"
    if a$ = "" then wait
    select case
    case a$ = "<-"
        level = level-1
        folder$ = word$(path$, level, "\")
        path$ = left$(path$, len(path$)-len(folder$)-1)
        folder$ = folder$; "\"
        doubleClick = 1
        if level = 1 then
            call ReadDrives
            #folderdlg.lb, "reload"
        else
            call ListFolders path$
        end if
        #folderdlg.lb, "select "; left$(folder$, len(folder$)-1)
 
    case doubleClick = 0
        doubleClick = 1
        folder$ = a$; "\"
 
    case doubleClick = 1
        doubleClick = 0
        if folder$ = a$+ "\" then
            level = level+1
            path$ = path$; folder$
            folder$ = ""
            call ListFolders path$
        else
            doubleClick = 1
            folder$ = a$; "\"
        end if
 
    end select
    #folderdlg.tb, path$; folder$
    wait
 
    [FolderOk]
    #folderdlg.tb, "!contents? JBFolderDialog$"
    #folderdlg.ex, "!contents? thingtohuntfor$"
    thingtohuntfor$ = "*.";right$(thingtohuntfor$,3)  ' seulement les 3 derniers caractères nécessaire sont utilisés...
    if thingtohuntfor$ = "" then thingtohuntfor$ = "*.bas"
 
    close #folderdlg
    exit function
 
    [FolderCancel]
    close #folderdlg
    end
end function
 
sub ReadDrives
    while word$(Drives$, c+1) <> ""
        c = c+1
    wend
    redim FolderDlg$(c)
    for i = 1 to c
        FolderDlg$(i) = word$(Drives$, i)
    next i
end sub
 
sub ListFolders path$
    files path$, "*.*", info$(
    n = val(info$(0,0))
    q = val(info$(0,1))
    redim FolderDlg$(q+1)
    FolderDlg$(1) = "<-"
    for i = 1 to q
        FolderDlg$(i+1) = info$(n+i, 1)
    next i
    #folderdlg.lb, "reload"
end sub
 

Et ça c'est ma version:
Code VB :
 
' Mark Parkinson
' 08/10/02

' This program will list all the files in the whole directory structure
' which match the given file spec. A process called recursion is used.

' Feel free to use and adapt the program eg to sum the filespace used or
' delete files or rename files or move them.
' It is also easy to adapt the program to delete empty subdirectories.
    WindowWidth=540
    WindowHeight=305
    UpperLeftX=30'INT((DisplayWidth-WindowWidth)/2)
    UpperLeftY=100'INT((DisplayHeight-WindowHeight)/2)

    dim info$(10, 10)  'Ready for the files command.
    global conte
 
    'STATICTEXT #w.ouv, "OUVERT", 420, 80, 60, 20
    BUTTON #w.go, "EXPLORATEUR", [start], UL, 300, 15, 90, 25
    TEXTBOX #w.res, 20 , 90, 510, 25
    TEXTBOX #w.ex, 195 , 180, 40, 25
    BUTTON #w.ok, "Ok ?", [ok], UL, 340, 180, 40, 20
    BUTTON #w.go, "Go", [go], UL, 430, 180, 40, 20
    TEXTBOX #w.nomb, 340 , 220, 70, 20
    GRAPHICBOX #w.g, 5, 5, 520, 260
 
    open "Folder Analyser" FOR WINDOW AS #w
     print #w, "trapclose [quit]"  ' Le print est facultatif
     #w.g, "down"
     #w.g, "fill black"
      #w.go,"!disable":#w.ok,"!disable"
      #w.ex,"":exo$=""
      #w.g, "color yellow; backcolor black"
      #w.g, "font courier_new 14 bold"
      #w.g, "place 30 25":#w.g, "\ CHOISIR UN DOSSIER -->"
      #w.g, "font courier_new 12 bold"
      #w.g, "place 20 65":#w.g, "\ Puis, Ouvrir un fichier dans le dossier."
 
    #w.g, "color green; backcolor black"
    #w.g, "place 10 130":#w.g, "\ Ci-dessus: Supprimer la partie droite"
    #w.g, "place 10 160":#w.g, "\ Jusqu'au Dossier à Analyser/."
    #w.g, "color yellow; backcolor black"
    #w.g, "place 20 190":#w.g, "\Extension .???->"
    #w.g, "place 245 190":#w.g, "\PUIS:-->"
    #w.g, "place 390 190":#w.g, "\-->"
      #w.g, "color red; backcolor black"
      #w.g, "place 20 230":#w.g, "\NOMBRE DE FICHIERS TROUVES --->"
      #w.g, "flush"
 
  wait
 
  [start]
    filedialog "Open text file", "*.*", fileName$
    print "File chosen is ";fileName$
    #w.res,fileName$
 
    #w.ok,"!enable"
  wait
  [ok]
      conte=0
    #w.go,"!enable"
    #w.res, "!contents? var$"
    #w.ex, "!contents? exo$"
    if exo$="" then
       exo$=".*"
    end if
  wait
  [go]
  '---------------------------------- CORPS DU PROG -------------------------------
'Note no backslash - added later on.
placetohunt$= var$ 'chemin
thingtohuntfor$= "*"+ exo$ ' extension

print "now listing all files in ";placetohunt$;" which match ";thingtohuntfor$
print
 
call recurse placetohunt$, thingtohuntfor$
print
print "finished"
  #w.nomb, str$(conte)
 
 'close #w

'end
wait
 
sub recurse pathspec$,mask$
    'Put in the backslash separator.
    pathspec$=pathspec$+"\"
    files pathspec$, mask$, info$(
 
    filecount=val(info$(0, 0))
    subdircount=val(info$(0, 1))
 
for i=1 to filecount
    filename$= pathspec$+info$(i, 0)
    filesize$= info$(i, 1)
    datestamp$=info$(i, 2)
    print filename$;"     ";filesize$
    conte=conte+1
next i
 
'Arrays cannot be local to subs so the subdirs
'are all put in a string separated by *'s which
'can't occur in filenames.
list$=""
for i=1 to subdircount
    list$=list$+pathspec$+info$(f + i, 1)+"*"
next i
 
'The subdirs are now pulled out of the (local)
'string one at a time and the sub is called again.
'This process where a sub calls itself
'is called recursion.
while list$<>""
    p=instr(list$,"*")
    p$=left$(list$,p-1)
    call recurse p$,mask$ 
    list$=mid$(list$,p+1)
wend
end sub
 
  wait
  [quit]
    CLOSE #w
    END
 
____________________
Roro

   
Le 22/07/2017 à 21h53

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 516
Merci pour cette trouvaille bien carrée et documentée. Un de ces jours il faudra que je me documente sur la récursivité...

On constate que Mark a dimensionné son info$ à (1,1) et que son programme liste le contenu du disque, preuve s'il y en avait besoin que nous ne sommes pas en présence d'un tableau conventionnel.

Il y a aussi ce que je prenais pour un oubli dans l'aide, et qu'on retrouve dans le listing sans que le compilateur s'en offusque : files pathspec$, mask$, info$( sans la parenthèse fermante.

On s'attendrait à trouver des instructions plus spécifiquement dédiées, et l'aide ne m'a pas permis de m'en sortir (à moins d'avoir loupé un chapitre ;) )

La version de Mark liste tout le disque, et la tienne permet de choisir un dossier si on peut y sélectionner un fichier, mais il n'y a toujours pas moyen de sélectionner directement un dossier et de dire à JB/LB "fais la liste des fichiers que tu trouves là-dedans"...

En attendant une évolution de JB/LB en ce sens, et fort de cette nouvelle expérience, je m'en retourne à mes tables. La discussion est toujours ouverte, bien sûr.
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 22/07/2017 à 22h20

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2083
Citation:
pas moyen de sélectionner directement un dossier

Bah on dirait bien que non; déjà bien que JB ouvre l'explorateur Windows et les navigateurs
Peut-être que LB en fait plus sur ce plan mais je ne crois pas

La récursivité...Sujet de tous les tourments.
____________________
Roro

   
Débutant » [Réglé] Comment fonctionne FILES ??? erreur "system primitive failed"  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie