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

Partagez votre expérience de PureBasic avec les autres utilisateurs.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

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

Message 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
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

J'avais pas vu ton code ...

Même longueur d'onde.

Slts
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

bah, le mieux, ce serait que CreateDirectory l'intègre directement, non ?
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message 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.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Tout à fait d'accord avec toi fweil, le flag c'est plus souple.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Peut-être avec la version 4 ....
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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...
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message 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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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é
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

J'comprend pas ce que tu dis DoBro. Elle s'applique à qui ta remarque ?
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Normal, il y a presque 3 ans! :lol:
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre