une petite astuce pour déplacer tout un dossier aussi simplement qu'un fichier.
Longtemps pour déplacer un dossier d'un répertoire à un autre j'utilisais CopyDirectory() puis DeleteDirectory(). Trop lourd...

Mais La fonction RenameFile() de PB permet de le faire beaucoup plus simplement et rapidement, d'autant avec support SSD.
Aussi, pour ceux qui ne l'auraient pas encore utilisée pour cela, je propose 2 méthodes :
La méthode 2 et son exemple d'utilisation sont commentés. Il vous suffit d'inverser les commentaires pour tester les 2.
Code : Tout sélectionner
;- Récupérer le Nom d'un dossier (LSI)
Structure Characters
c.c[0]
EndStructure
Procedure.s GetDirectoryPart(FileName.s)
Protected Directory.s, i.l
Protected *Directory.Characters
Directory = GetPathPart(FileName)
If Directory
i = Len(Directory) - 2
*Directory = @Directory
While i >= 0 And *Directory\c[i] <> '/' And *Directory\c[i] <> '\'
i - 1
Wend
i + 2
Directory = Mid(Directory, i, Len(Directory) - i)
EndIf
ProcedureReturn Directory
EndProcedure
;-Déplacer un dossier (Jacobus)
;Deux façons de faire, au choix suivant affinités.
;-Méthode 1
Procedure Rename_Directory(AncienNom$)
NomDossier$ = GetDirectoryPart(AncienNom$)
Lc = Len(AncienNom$)-1
AncienNom$ = RemoveString(AncienNom$,"\",0,Lc,1)
NouveauNom$ = PathRequester("Choisissez un répertoire de destination", AncienNom$);,WindowID(#Win))
If NouveauNom$
If RenameFile(AncienNom$, NouveauNom$+NomDossier$) = 0
MessageRequester("Déplacement de dossier","Echec lors du déplacement du dossier : "+NomDossier$ +Chr(10)+"Il est peut-être en cours d'utilisation. Réessayez ultérieurement après l'avoir fermé.", #MB_ICONEXCLAMATION | #PB_MessageRequester_Ok);,WindowID(#Win))
EndIf
Else
MessageRequester("Information", "Le déplacement du dossier a été annulé.", #PB_MessageRequester_Ok);,WindowID(#Win))
EndIf
EndProcedure
;-Méthode 2
; Procedure RenameDirectory(AncienNom$,NouveauNom$)
;
; NomDossier$ = GetDirectoryPart(AncienNom$)
; Lc = Len(AncienNom$)-1
; AncienNom$ = RemoveString(AncienNom$,"\",0,Lc,1)
; If RenameFile(AncienNom$, NouveauNom$+NomDossier$) = 0
; ProcedureReturn 0
; Else
; ProcedureReturn 1
; EndIf
;
; EndProcedure
;Dans ces exemples on part d'un requester, mais c'est facilement adaptable pour
;utilisation depuis un ExplorerListGadget() ou un ExplorerTreeGadget() par exemple, en récupérant le nom de l'élément sélectionné...
;-Exemple Méthode 1
CheminInitial$ = "C:\" ; Répertoire par défaut qui sera affiché (une chaîne vide est aussi possible)
AncienNom$ = PathRequester("Choisissez un dossier à déplacer", CheminInitial$);,WindowID(#Win))
If AncienNom$
RenameDirectory(AncienNom$)
Else
MessageRequester("Information", "La sélection a été annulée.", #PB_MessageRequester_Ok);,WindowID(#Win))
EndIf
;-Exemple Méthode 2
; CheminInitial$ = "C:\" ; Répertoire par défaut qui sera affiché (une chaîne vide est aussi possible)
; AncienNom$ = PathRequester("Choisissez un dossier à déplacer", CheminInitial$);,WindowID(#Win))
; If AncienNom$
; NouveauNom$ = PathRequester("Choisissez un répertoire de destination", AncienNom$);,WindowID(#Win))
; If NouveauNom$
; If RenameDirectory(AncienNom$,NouveauNom$) = 0
; MessageRequester("Déplacement de dossier","Echec lors du déplacement du dossier" +Chr(10)+"Il est peut-être en cours d'utilisation. Réessayez ultérieurement après l'avoir fermé.", #MB_ICONEXCLAMATION | #PB_MessageRequester_Ok);,WindowID(#Win))
; EndIf
; EndIf
; Else
; MessageRequester("Information", "Le déplacement du dossier a été annulé.", #PB_MessageRequester_Ok)
; EndIf
