Forum Liberty Basic France

Général » MKDIR : créer des dossiers erreur "system primitive failed"
Le 01/01/2021 à 10h29

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Bonjour !

Rien ne résiste à l'analyse ;)

Enfin presque, parce que je ne suis pas certain d'avoir trouvé la réelle cause du problème, le code malade s'étant mis à ne plus le reproduire. Mais il en fait d'autres, et c'est un problème de conception de ma part.

En tout cas, lorsque dans le tableau listant les noms de fichiers et de dossiers, je fournis un index plus grand que la somme des quantités de fichiers et dossiers, le "system primitive failed" arrive.

Voici, pour info, ce code. Il est extrait de la discussion "shoot'em up '80", plus précisément du zip generesprite001-04_1
Code VB :
 
 
'   fichiers
    dosspr$="sprites"   'contiendra les sprites créés
    dosmat$="matrices"  'et les matrices sauvegardées par l'utilisateur

'vérifier la présence des dossiers et les créer au besoin
    'test de l'existence des dossiers
    dim info$(10, 10)
    files DefaultDir$, info$()  'on travaille dans le même dossier que le programme
    nbdossiers=val(info$(0,1)) 'nombre de dossiers trouvés

    's'il n'y a pas de dossiers
    if nbdossiers=0 then
 
        'on les créée
        numdosm=mkdir(dosmat$)
        numdoss=mkdir(dosspr$)
 
        'si la création se passe mal, on prévient l'utilisateur
        if numdosm<>0 then notice "1. erreur ";numdosm;", le dossier ";dosmat$;" n'a pas été créé"
        if numdoss<>0 then notice "2. erreur ";numdoss;", le dossier ";dosspr$;" n'a pas été créé"
 
    else
        'il y a des dossiers
        'on en fait le tour à la recherche des dossiers attendus
        dosm=0:doss=0
        for dossier=1 to nbdossiers
            fi$=info$(dossier+2, 1) 'pourquoi +2 ?
            if fi$=dosmat$ then dosm=dosm+1
            if fi$=dosspr$ then doss=doss+1
        next
 
        's'il manque le dossier des matrices
        if dosm=0 then
            'on le créé
            numdosm=mkdir(dosmat$)
            if numdosm<>0 then notice "3. erreur ";numdosm;", le dossier ";dosmat$;" n'a pas été créé"
        end if
 
        's'il manque le dossier des sprites
        if doss=0 then
            'eh bien on le créée aussi
            numdoss=mkdir(dosspr$)
            if numdoss<>0 then notice "4. erreur ";numdoss;", le dossier ";dosspr$;" n'a pas été créé"
        end if
    end if
 


Dans ce code, l'erreur est dans la composition du premier index de info$(a,b) : il vaut "compteur de boucle + 2" alors qu'il aurait dû être "nombre de fichiers + 1 + compteur de boucle". En outre, le +2 devait sûrement permettre de dépasser la capacité du tableau, et de provoquer le "system primitive failed".

Quoi qu'il en soit, j'ai rectifié et simplifié la routine en :
Code VB :
 
    'test de l'existence des dossiers
    dim info$(10, 10)
    files DefaultDir$, info$()  'on travaille dans le même dossier que le programme
    nbdossiers=val(info$(0,1))  'nombre de dossiers trouvés
    nbfichiers=val(info$(0,0))  'nombre de fichiers trouvés
	
    'on fait le tour des dossiers trouvés
    dosmat$="matrices"
    dosspr$="sprites"
    mat=0   '0=dossier des matrices à crééer, 1=dossier existe déjà
    spr=0   '0=dossier des sprites à crééer, 1=dossier existe déjà
    for nbd=1 to nbdossiers
        a$=info$(nbfichiers+nbd, 1)
        if a$=dosmat$ then mat=1
        if a$=dosspr$ then spr=1
    next
 
    'si le dossier des matrices n'existe pas, on le créée
    if mat=0 then
        numdosm=mkdir(dosmat$)
        if numdosm<>0 then notice "Erreur ";numdosm;", le dossier ";dosmat$;" n'a pas été créé"
    end if
 
    'si le dossier des sprites n'existe pas, on le créée
    if spr=0 then
        numdoss=mkdir(dosspr$)
        if numdoss<>0 then notice "Erreur ";numdoss;", le dossier ";dosspr$;" n'a pas été créé"
    end if
 


MKDIR renvoie le code 183 quand il veut créer un dossier qui existe déjà, et 0 quand tout se passe comme prévu :
Code VB :
 
'créer un dossier
    ch$=DefaultDir$;"\le dossier"
    d=mkdir(ch$):print d
    d=mkdir(ch$):print d
 
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ 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 01/01/2021 à 12h46

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2480
Citation:
index plus grand que la somme des quantités de fichiers et dossiers, le "system primitive failed"
arrive.

Bah alors c'est normal.
Citation:
MKDIR renvoie le code 183 quand il veut créer un dossier qui existe déjà

Qu'importe le code d'erreur puisque elle est sans effet.
Il n'en va pas de même à la destruction.
____________________
Roro

   
Le 03/01/2021 à 10h08

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Bah oui c'était normal, encore fallait-il trouver ce qui coinçait... Le code d'erreur 183 est mentionné pour info : si à l'avenir dans nos projets on le rencontre a nouveau, on saura qu'il y a déjà un dossier du même nom que celui qu'on veut créer.
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ 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 03/01/2021 à 11h38

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2480
Citation:
on saura qu'il y a déjà un dossier du même nom que celui qu'on veut créer.

De toutes façons, Windows refuse de créer un dossier au nom d'un existant.
Il faudrait voir si la recréation écrase ou est ignorée.
____________________
Roro

   
Général » MKDIR : créer des dossiers 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