Page 1 sur 2

Création de fichier avec chemin d'accès

Publié : mer. 09/juin/2004 8:13
par fweil
Lorsque l'on créé un fichier on doit s'assurer que le chemin éventuel existe déjà.

Celà ne pose pas un gros problème puisque le chemin peut être créé avant.

Mais cela peut rendre l'écriture du programme un peu plus lourde.

Alors pour me simplifier la vie, je fais comme ça :

Code : Tout sélectionner

;
; Créé un fichier au bout d'un chemin d'accès en créant les répertoires intermédiaires si ils n'existent pas.
;
Procedure DoCreateFile(n.l, FileName.s)
  PathPart.s = ""
  FilePart.s = GetFilePart(FileName)
  If GetPathPart(FileName) <> ""
      i = 1
      Repeat
        Node.s = StringField(FileName, i, "\")
        If Node = FilePart
            Break
        EndIf
        PathPart + Node + "\"
        If FileSize(PathPart) = -2
          Else
            CreateDirectory(PathPart)
        EndIf
        i + 1
      Until Node = ""
  EndIf
  ProcedureReturn CreateFile(n, FileName)
EndProcedure

;
; Test
;
  If DoCreateFile(0, "toto\dudule\machin.txt")
      CloseFile(0)
  EndIf

  If DoCreateFile(0, "machin.txt")
      CloseFile(0)
  EndIf
End

Publié : mer. 09/juin/2004 10:08
par Le Soldat Inconnu
oui, c'est a peu de chose près ce code que j'ai mis sur CodesFR

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.90
;
; Explication du programme :
; Ce code permet de créer un dossier dont le ou les répertoires parents n'existent pas.
; Exemple : 
; je souhaite créé le dossier "C:\Program files\truc\bidule"
; Seul le dossier "C:\Program files\" existe
; Si j'utilise CreateDirectory("C:\Program files\truc\bidule"), cela ne va pas marcher car le dossier "C:\Program files\truc\" n'existe pas
; Si j'utilise CreateDirectoryEx("C:\Program files\truc\bidule"), tous les les dossiers seront créés :
; C:\Program files\
; C:\Program files\truc\
; C:\Program files\truc\bidule


Procedure.l CreateDirectoryEx(FolderPath.s)
  ; Retourne 1 si la création du dossier à réussi, 0 sinon
  Protected Folder.s, Txt.s, Cpt.l
  If FileSize(Folder) = -1
    Folder.s = StringField(FolderPath, 1, "\") + "\"
    Cpt.l = 1
    Repeat
      Cpt + 1
      Txt.s = StringField(FolderPath, Cpt, "\")
      Folder = Folder + Txt + "\"
      CreateDirectory(Folder)
    Until Txt = ""
  EndIf
  If FileSize(FolderPath) = -2
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure


;- Test
If CreateDirectoryEx("c:\truc\bidule")
  MessageRequester("", "Le dossier 'c:\truc\bidule' a été créé", 0)
Else
  MessageRequester("Erreur", "impossible de créer le dossier 'c:\truc\bidule'", 0)
EndIf

Publié : mer. 09/juin/2004 10:26
par fweil
J'avais pas vu ton code ...

Même longueur d'onde.

Slts

Publié : mer. 09/juin/2004 13:12
par Le Soldat Inconnu
bah, le mieux, ce serait que CreateDirectory l'intègre directement, non ?

Publié : mer. 09/juin/2004 13:16
par fweil
oui et non ... si CreateDirectory le permet avec un paramètre optionnel je suis d'accord, sinon il vaut mieux éviter car cela laisse la porte ouverte à la création de répertoires sans contrôle.

Dans ce cas, un prog en développement et contenant des bugs peut provoquer des catastrophes.

Donc on peut demander que cela soit rendu possible avec un paramètre pour sécuriser la chose.

Publié : mer. 09/juin/2004 13:31
par Anonyme2
Tout à fait d'accord avec toi fweil, le flag c'est plus souple.

Publié : mer. 04/janv./2006 19:27
par Anonyme2
Peut-être avec la version 4 ....

Publié : jeu. 05/janv./2006 13:11
par lionel_om
Ya une commande MSDN qui le fait (pas générique c'est vrai..)

Par contre vos codes doivent avoir les deux même erreurs :
* vous ne vous assurez pas que le Drive existe
* vous ne vous assurez pas que vous avez les droits en écriture : "CreateDirectory()" peut échouer...

Publié : jeu. 05/janv./2006 15:48
par gnozal
lionel_om a écrit :Ya une commande MSDN qui le fait (pas générique c'est vrai..)
Personellement, j'utilise MakeSureDirectoryPathExists_() [API Windows].
Selon Win32.hlp :
The MakeSureDirectoryPathExists function creates all the directories in the specified DirPath.

BOOL MakeSureDirectoryPathExists(

IN LPSTR DirPath
);

Parameters

DirPath

A pointer to an ASCII string that contains a valid path name.


Return Values

If the function succeeds, the return value is TRUE.
If the function fails, then the return value is FALSE. To retrieve extended error information, call GetLastError.

Remarks

The DirPath is parsed and each directory, beginning at the root, is created, if it does not already exist. If only some of the directories are created, the function will return FALSE.

Publié : jeu. 05/janv./2006 19:16
par Backup
oui ! mais tu ne verifie pas que tu as un ordinateur !!!

resultat=if_ordinateur_exist ()

resultat =1 ; l'ordinateur existe , sinon il n'existe pas ... :D

ya aussi

if _edf_est_payé

Publié : ven. 06/janv./2006 13:04
par lionel_om
J'comprend pas ce que tu dis DoBro. Elle s'applique à qui ta remarque ?

Publié : sam. 22/nov./2008 10:00
par Progi1984
Amélioration de ton code LSI pour le rendre multiplateforme

Code : Tout sélectionner

CompilerIf #PB_Compiler_OS = #PB_OS_Linux
  #System_Separator = "/"
  PathSystem.s = "/tmp/test1/test2/test3"
CompilerElse
  #System_Separator = "\"
  PathSystem.s = "C:\test1\test2\test3"
CompilerEndIf
; Auteur : Le Soldat Inconnu
;
; Explication du programme :
; Ce code permet de créer un dossier dont le ou les répertoires parents n'existent pas.
; Exemple :
; je souhaite créé le dossier "C:\Program files\truc\bidule"
; Seul le dossier "C:\Program files\" existe
; Si j'utilise CreateDirectory("C:\Program files\truc\bidule"), cela ne va pas marcher car le dossier "C:\Program files\truc\" n'existe pas
; Si j'utilise CreateDirectoryEx("C:\Program files\truc\bidule"), tous les les dossiers seront créés :
; C:\Program files\
; C:\Program files\truc\
; C:\Program files\truc\bidule


Procedure.l CreateDirectoryEx(FolderPath.s)
 ; Retourne 1 si la création du dossier à réussi, 0 sinon
 Protected Folder.s, Txt.s, Cpt.l
 If FileSize(Folder) = -1
  Folder.s = StringField(FolderPath, 1, #System_Separator) + #System_Separator
  Cpt.l = 1
  Repeat
   Cpt + 1
   Txt.s = StringField(FolderPath, Cpt, #System_Separator)
   Folder = Folder + Txt + #System_Separator
   CreateDirectory(Folder)
  Until Txt = ""
 EndIf
 If FileSize(FolderPath) = -2
  ProcedureReturn #True
 Else
  ProcedureReturn #False
 EndIf
EndProcedure


;- Test
If CreateDirectoryEx(PathSystem)
 MessageRequester("Succes", "Le dossier '"+PathSystem+"' a été créé", 0)
Else
 MessageRequester("Erreur", "impossible de créer le dossier '"+PathSystem+"'", 0)
EndIf

Publié : sam. 22/nov./2008 12:28
par Backup
lionel_om a écrit :J'comprend pas ce que tu dis DoBro. Elle s'applique à qui ta remarque ?
ben moi non plus !! 8O 8O

je ne me souviens pas du tout avoir ecrit ça !! 8O

c'est dingue !! :? 8O

Publié : sam. 22/nov./2008 12:30
par Jacobus
Normal, il y a presque 3 ans! :lol:

Publié : dim. 23/nov./2008 0:07
par Le Soldat Inconnu
Ca le rajeunit pas, le Dobro.

J'espère qu'il ne va pas devenir sénile ... il commence déjà a ne plus comprendre ce qu'il dit ... :roll: :lol: