Salut.
Bon j'ai amélioré la fonction DirectoryCreate(dossier$) et supprimé un bug qui faisait que ça ne fonctionnait pas sous Linux.
Le problème avec la fonction originale et ma 1ère version c'est qu"il y avait toujours un tour de boucle inutile pour vérifier au final que dossier$ était bien vide pour pouvoir sortir de la boucle et après être sorti de la boucle une soustraction était effectuée.
Donc pour éviter tout ça je suis passé par une boucle For...Next.
Et plus de soustraction non plus.
Le problème qui faisait que cela ne fonctionnait pas sous Linux c'était simplement ça : CompilerCase #PB_OS_Linux Or #PB_OS_MacOS
D'ailleurs si quelqu'un sait comment combiner plusieurs OS (Si c'est possible) , parce que même la virgule ne fonctionne pas.
Mais ceci étant dit, j'ai changé mon fusil d'épaule et pour être sûr d'une Procedure Multi-Plateforme et fonctionnelle avec la Démo de PB, je préfère utiliser le même code pour tous les OS sans API.
J'ai ajouté :
Code : Tout sélectionner
; Utile pour la portabilitée du code.
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows : #EOL$ = #CRLF$ : #SeparatorDir = "\"
CompilerCase #PB_OS_Linux : #EOL$ = #LF$ : #SeparatorDir = "/"
CompilerCase #PB_OS_MacOS : #EOL$ = #CR$ : #SeparatorDir = "/"
CompilerEndSelect
Bon #EOL$ dans le cas présent ne sert à rien.
Voici le code avec ton cartouche Typhoon, mais à la place des [X] je trouve plus compréhensible [Ok] et j'ai ajouté Demo, qui permet de préciser que le code est fonctionnel avec la version de Démo de PB.
Code : Tout sélectionner
;*********************************
;* Title : DirectoryCreate(dossier$)
;* Author : GeoTrouvpatou
;* Date : 13/09/2011
;* Compatibility
;* Windows x86 [?] | Windows x64 [Ok]
;* Linux x86 [?] | Linux x64 [Ok]
;* MacOs PPC [?] | MacOs intel [?]
;* Unicode [?]
;* Demo [Ok]
;*********************************
DebugLevel 2
; Utile pour la portabilitée du code.
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows : #EOL$ = #CRLF$ : #SeparatorDir = "\"
CompilerCase #PB_OS_Linux : #EOL$ = #LF$ : #SeparatorDir = "/"
CompilerCase #PB_OS_MacOS : #EOL$ = #CR$ : #SeparatorDir = "/"
CompilerEndSelect
Procedure.b DirectoryCreate(dossier$)
; Il est préférable de mettre le code ci-dessous parce que
; si l'on met pour dossier$ : "toto\titi\vovo\aze" cela ne créer pas
; le repertoire "aze" considérant que c'est un fichier.
If Right(dossier$, 1) <> #SeparatorDir
dossier$ + #SeparatorDir
EndIf
; ; ; CompilerSelect #PB_Compiler_OS
; ; ;
; ; ; CompilerCase #PB_OS_Windows
; ; ; Debug "Windows Use"
; ; ; ; Sous Windows autant utiliser une API existante.
; ; ; ProcedureReturn MakeSureDirectoryPathExists_(dossier$)
; ; ;
; ; ;
; ; ; CompilerCase #PB_OS_Linux ;Or #PB_OS_MacOS
; ; ; Debug "Linux Use"
Protected.b nbDossiersPourBoucle, indexDossierActuel ; Sert à la boucle For ... Next
Protected nbDossiersExistants.b ; Nb de dossiers déjà créés.
Protected nomDossier$
Protected nomCheminComplet$
Debug dossier$, 2
nbDossiersPourBoucle = CountString(dossier$, #SeparatorDir)
Debug "Nombre de dossiers : "+ Str(nbDossiersPourBoucle), 2
For indexDossierActuel = 1 To nbDossiersPourBoucle
nomDossier$ = StringField(dossier$, indexDossierActuel, #SeparatorDir)
Debug "nomDossier$ : "+ nomDossier$, 2
; [1] On liste le chemin vers le dernier dossier.
; On a un dossier principal et pas de sous-dossier.
If indexDossierActuel = 1
nomCheminComplet$ + nomDossier$
Debug Str(indexDossierActuel) +" nomCheminComplet$ >>> " + nomCheminComplet$, 2
Else
; On a des sous-dossiers, donc à chaques fois, on ajoute
; le chemin précédent, plus un Slash plus le nom de dossier en cours.
nomCheminComplet$ + #SeparatorDir + nomDossier$
Debug Str(indexDossierActuel) +" nomCheminComplet$ >>> " + nomCheminComplet$, 2
EndIf
; [2] On créer le dossier en fonction de son chemin.
; Si c'est un dossier et qu'il existe alors on ne fait qu'incrementer nbDossiersExistants
If FileSize(nomCheminComplet$) = -2
nbDossiersExistants + 1
Else
; Si le dossier n'existe pas, alors on le créer et si le dossier a bien été créé,
; alors on incremente nbDossiersExistants
If CreateDirectory(nomCheminComplet$) <> 0
nbDossiersExistants + 1
EndIf
EndIf
Next indexDossierActuel
; [3] On vérifie si tous les dossiers ont bien été créés
Debug "nbDossiersPourBoucle : "+ Str(nbDossiersPourBoucle), 2
Debug "nbDossiersExistants : "+ Str(nbDossiersExistants), 2
; Si nbDossiersPourBoucle = nbDossiersExistants, alors c'est que tous
; les dossiers ont bien été créés et donc la procedure retourne 1
If nbDossiersPourBoucle = nbDossiersExistants
ProcedureReturn #True
EndIf
ProcedureReturn #False
; ; ; CompilerEndSelect
EndProcedure
; CallDebugger
; Exemple :
Debug DirectoryCreate("toto\titi\vovo\aze") ; Windows
; Debug DirectoryCreate("toto/titi/vovo/aze") ; Linux
; Debug DirectoryCreate("toto\") ; Test avec un unique dossier.
Bye.