Merc pour vos réponses.
J'ai utilisé les explications de Marc56 pour passer mes parametres depuis l'IDE mais l'erreur n'est pas visualisée dans la fenêtre de suivi.
Pour le peut de ce que je vois, l'erreur apparait lors du scann des fichiers procedure 'Listefichiers()'...
La table 'Partage' contient les chemins à scanner (ne sont pris en comptes que les chemins dont le champ ATraiter est positionné à 1)
La table 'Fichier' les fichiers trouvés dans les dossiers et sous dossiers listés dans 'groupes'
Code : Tout sélectionner
; Module de scann des disques
; ---------------------------
; Ce module peut être appelé pour 2 fonctions de scanns
; - Inventaire des répertoires disponibles sur les partages sélectionnés parametre
; - Inventaire des fichiers disponibles dans les répertoires sélectionnés
; L'appel de l'une ou l'autre des fonctions est réalisé par les commandes r ou f les deux fonctions peuvent être enchainées.
; Dans le cas d'un appel pour effectuer les 2 scanns, les répertoires seront toujours rafraichis en premiers.
; Les partages à scanner sont ceux positionnés à 1 dans la table "Partages" de la base "Inventaires.sqlite3"
; Initialisation de SQlite
UseSQLiteDatabase()
; Déclaration du tableau de parametres
Global Dim parametres$(1)
OpenConsole() ; Pour les tests
; Procédures de services
; ----------------------
Procedure Trace(type,donnee$)
Select type
Case 0
message$=FormatDate("%dd/%mm/%yyyy - %hh:%ii:%ss",Date())+Chr(9)+donnee$
Case 1 ; Message contient une chaine (xx|yy) pour calculer le pourcentage de xx par rapport à yy
valeurCourant=Val(Left(donnee$,FindString(donnee$,"|")))
valeurCent=Val(Right(donnee$,Len(donnee$)-FindString(donnee$,"|")))
pourcent=(100*valeurCourant)/valeurCent
message$="§00"+Str(pourcent) ; §00 -> Message système pour indiquer un retour en pourcentage
Case 2
message$="§01"+donnee$ ; §01 -> Message système pour indiquer que la chaine doit être affichée dans une barre de statut
EndSelect
; Envoi du texte vers la console
PrintN(message$)
EndProcedure
; Procédures de recherches
; ------------------------
; Procédure de listage des répertoires dans un partage
Procedure ListeRepertoires(base,index,partage$)
; Compter le nombre de dossier pour surveiller l'avancement
dossier=0
If ExamineDirectory(0,partage$,"*.*")
While NextDirectoryEntry(0)
If DirectoryEntryType(0)=#PB_DirectoryEntry_Directory And DirectoryEntryName(0)<>"." And DirectoryEntryName(0)<>"..":dossier+1:EndIf
Wend
EndIf
;trace(Str(dossier)+" dossiers trouvés")
; Enregistrer les dossiers en base
courant=1
If ExamineDirectory(0,partage$,"*.*")
While NextDirectoryEntry(0)
If DirectoryEntryType(0)=#PB_DirectoryEntry_Directory And DirectoryEntryName(0)<>"." And DirectoryEntryName(0)<>".."
; Elaboration de la requete de mise à jour des données
requete$="INSERT INTO Groupes VALUES ("+index+","+Chr(34)+DirectoryEntryName(0)+Chr(34)+")"
If DatabaseUpdate(base,requete$)=0:Trace(0,"Erreur lors de l'éxécution de la requête"+Chr(10)+Chr(13)+Chr(9)+"'"+requete$+"'"+Chr(10)+Chr(13)+Chr(9)+"Erreur : '"+DatabaseError()+"'"):End:EndIf
Trace(1,Str(courant)+"|"+Str(dossier))
courant+1
;Trace(requete$)
EndIf
Wend
FinishDirectory(0)
EndIf
EndProcedure
; Procédure de recherche des fichiers. Cette procèdure est appellée de façon récurcive pour lister tous les fichiers contenus dans les sous répertoires du réprtoire principal
Procedure Listefichiers(base,source$,rek=0) ; Source, indice
;Trace(chemin$)
; Ajoute "\" à la fin du chemin
If Right(source$,1)<>"\" : source$+"\" : EndIf
If ExamineDirectory(rek,source$,"*.*")
While NextDirectoryEntry(rek)
; Nom & Type répertoire source
name$=DirectoryEntryName(rek) ; Nom du chemin trouvé
type=DirectoryEntryType(rek) ; Type du chemin trouvé (répertoire ou fichier)
Select type ; Traitement selon le type trouvé (répertoire ou fichier)
Case #PB_DirectoryEntry_File ; Traitement si le type est "fichier"
; Construire le nom complet du fichier
fullname$=source$+name$
; Récupère les informations du fichier
taille=DirectoryEntrySize(rek) ; Taille du fichier
creation=DirectoryEntryDate(rek,#PB_Date_Created); Date de création du fichier
acces=DirectoryEntryDate(rek,#PB_Date_Accessed) ; Date du dernier accès au fichier
modification=DirectoryEntryDate(rek,#PB_Date_Modified) ; Date de la dernière modification du fichier
; Elaboration de la requete de mise à jour des données
requete$="INSERT INTO Fichiers VALUES ("+Chr(34)+fullname$+Chr(34)+","+taille+","+creation+","+modification+","+acces+")"
; Enregistrer les informations en base
If DatabaseUpdate(base,requete$)=0:Trace(0,"Erreur lors de l'éxécution de la requête"+Chr(10)+Chr(13)+Chr(9)+"'"+requete$+"'"+Chr(10)+Chr(13)+Chr(9)+"Erreur : '"+DatabaseError()+"'"):End:EndIf
trace(2,fullname$)
Case #PB_DirectoryEntry_Directory ; Traitement si type est "dossier"
If name$<>"." And name$<>".." ; Dossier différent de "." et ".."
Listefichiers(base,source$+name$,rek+1) ; Appel de la procédure en mode récurcif
EndIf
EndSelect
Wend
;Libère la mémoire
FinishDirectory(rek)
EndIf
EndProcedure
;----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
; Procédures d'indexation
; -----------------------
; Indexation des repertoires
Procedure IndexReps()
;Trace("Indexation répertoire") ; Pour tests
; Rechercher dans la tables "Partages" la liste à indexer
Trace(0,"Etablissement de la liste des partages à indexer")
; Connexion à la base de donnée
MaBase=OpenDatabase(#PB_Any,"Scanns.sqlite3","","",#PB_Database_SQLite)
If(MaBase) ; Si la connexion à réussi
Trace(0,"Connexion à la base réussi")
; Vider la table "Groupes"
If DatabaseUpdate(MaBase,"DELETE FROM Groupes")
Trace(0,"Purge de la table des groupes réalisée")
Else
Trace(0,"Impossible de vider la table des groupes, Erreur : "+DatabaseError())
Trace(0,"Arrêt du traitement")
End
EndIf
; Rechercher les partages à indexer
requete$="SELECT Chrono,Partages FROM Partages WHERE ATraiter=1" ; Construction de la requête
reponse=DatabaseQuery(MaBase,Requete$)
;Trace(Str(reponse)) ; Pour tests
If(reponse<>0)
; Tracer le début du scann des répertoires
requete$="INSERT INTO Dates_Scanns VALUES ("+Date()+","+Chr(34)+"Début scann répertoires"+Chr(34)+")"
If DatabaseUpdate(MaBase,requete$)=0:Trace(0,"Erreur lors de l'éxécution de la requête"+Chr(10)+Chr(13)+Chr(9)+"'"+requete$+"'"+Chr(10)+Chr(13)+Chr(9)+"Erreur : '"+DatabaseError()+"'"):End:EndIf
; Lire les enregistrement remontés
While NextDatabaseRow(MaBase)
Trace(0,"Liste les répertoires trouvés dans : "+GetDatabaseString(MaBase,1))
ListeRepertoires(MaBase,GetDatabaseQuad(MaBase,0),GetDatabaseString(MaBase,1))
Wend
; Tracer la fin du scann des répertoires
requete$="INSERT INTO Dates_Scanns VALUES ("+Date()+","+Chr(34)+"Fin scann répertoires"+Chr(34)+")"
If DatabaseUpdate(MaBase,requete$)=0:Trace(0,"Erreur lors de l'éxécution de la requête"+Chr(10)+Chr(13)+Chr(9)+"'"+requete$+"'"+Chr(10)+Chr(13)+Chr(9)+"Erreur : '"+DatabaseError()+"'"):End:EndIf
Else
Trace(0,"Problème lors de l'exécution de la requête."+Chr(10)+Chr(13)+Chr(9)+requete$+Chr(10)+Chr(13)+Chr(9)+"Erreur : '"+DatabaseError()+"'")
EndIf
CloseDatabase(MaBase)
Trace(0,"Fermeture de la base de données")
Else
Trace(0,"Erreur de connexion à la base de données")
End
EndIf
EndProcedure
; Indexation des fichiers
Procedure IndexFichiers()
Trace(0,"Indexation fichiers") ; Pour tests
; Examen de la liste des dossiers indéxés
; Connexion à la base de donnée
MaBase=OpenDatabase(#PB_Any,"Scanns.sqlite3","","",#PB_Database_SQLite)
If(MaBase) ; Si la connexion à réussi
Trace(0,"Connexion à la base réussi")
; Vider la table des "Fichiers"
If DatabaseUpdate(MaBase,"DELETE FROM Fichiers")
Trace(0,"Purge de la table des fichiers réalisée")
Else
Trace(0,"Impossible de vider la table des fichiers, Erreur : "+DatabaseError())
Trace(0,"Arrêt du traitement")
End
EndIf
; Lecture des chemins à explorer
requete$="SELECT Groupe,Partages FROM Groupes INNER JOIN Partages ON Groupes.Partage=Partages.Chrono"
reponse=DatabaseQuery(MaBase,Requete$)
If(reponse<>0)
; Tracer le début du scann des fichiers
requete$="INSERT INTO Dates_Scanns VALUES ("+Date()+","+Chr(34)+"Début scann fichiers"+Chr(34)+")"
If DatabaseUpdate(MaBase,requete$)=0:Trace(0,"Erreur lors de l'éxécution de la requête"+Chr(10)+Chr(13)+Chr(9)+"'"+requete$+"'"+Chr(10)+Chr(13)+Chr(9)+"Erreur : '"+DatabaseError()+"'"):End:EndIf
; Lire les enregistrement remontés
While NextDatabaseRow(MaBase)
Listefichiers(MaBase,GetDatabaseString(MaBase,1)+"\"+GetDatabaseString(MaBase,0))
;Scan_Directory(GetDatabaseString(MaBase,1)+"\"+GetDatabaseString(MaBase,0))
Wend
; Tracer la fin du scann des fichiers
requete$="INSERT INTO Dates_Scanns VALUES ("+Date()+","+Chr(34)+"Fin scann fichiers"+Chr(34)+")"
If DatabaseUpdate(MaBase,requete$)=0:Trace(0,"Erreur lors de l'éxécution de la requête"+Chr(10)+Chr(13)+Chr(9)+"'"+requete$+"'"+Chr(10)+Chr(13)+Chr(9)+"Erreur : '"+DatabaseError()+"'"):End:EndIf
Else
Trace(0,"Problème lors de l'exécution de la requête."+Chr(10)+Chr(13)+Chr(9)+requete$+Chr(10)+Chr(13)+Chr(9)+"Erreur : '"+DatabaseError()+"'")
EndIf
CloseDatabase(MaBase)
Else
Trace(0,"Erreur de connexion à la base de données")
End
EndIf
EndProcedure
;----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
; Procédure principale
; --------------------
Procedure MainProc()
;Trace("Traitement des parametres") ; Pour tests
NbParametre=ArraySize(parametres$())
;Trace("Nombre de paramatre="+NbParametre) ; Pour tests
If(parametres$(0)="f" And NbParametre>1) : Swap parametres$(0),parametres$(1) : EndIf ; Si les parametres ne sont pas dans le bon ordre, les inversser (Toutjour raffraichie ls dossiers avant les fichiers).
; Traiter les parametres
For i=0 To NbParametre-1
;Trace("Parametre "+i+" = "+parametres$(i)) ; Pour tests
Select parametres$(i)
Case "r" ; Indexer les répertoires
Trace(0,"Début d'indexation des répertoires")
IndexReps()
Trace(0,"Fin d'indexation des répertoires")
Case "f" ; Indexer les fichiers
Trace(0,"Début d'indexation des fichiers")
IndexFichiers()
Trace(0,"Fin d'indexation des fichiers")
EndSelect
Next i
EndProcedure
;---------------------------------------------------------------------------------------------------------------------------------------------------------
; Programme principal
; -------------------
; Effectuer le traitement en fonction du nombre de parametre passé au programme
Select CountProgramParameters()
Case 0
; Si pas de parametre
Trace(0,"Pas de parametre") ; Erreur d'appel
Case 1 To 2
; 1 à 2 parametres, appel normal
For i=0 To CountProgramParameters()-1
;trace(0,Str(i)+" -> "+ProgramParameter(i))
;Input() ; Pour les tests
If(i=1) : ReDim parametres$(2) : EndIf ; Si 2 parametres reçus, redimentionner le tableau
If(ProgramParameter(i)<>"r" And ProgramParameter(i)<>"f") ; Erreur dans les parametres d'appel
Trace(0,"Parametre '"+ProgramParameter(i)+"' inconnu")
;Input() ; Pour les tests
End ; Fin de programme
Else
If(ProgramParameter(i)<>" ") : parametres$(i)=ProgramParameter(i) : EndIf ; Enregistrer les parametres passés dans le tableau 'parametres$'
;Trace("Parametre "+i+" "+parametres$(i)) ; Pour tests
EndIf
Next i
; Appel de la procèdure principale
; --------------------------------
MainProc()
Default
; Si plus que 2 parametres
Trace(0,"Trop de parametre") ; Erreur d'appel
EndSelect
Input() ; Pour les tests
; Fin du programme
End