Page 1 sur 1

Déplacer un dossier - RenameDirectory()

Publié : jeu. 21/nov./2024 14:56
par Jacobus
Salut tout le monde,
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 
En espérant que cela vous servira et vous évitera de vous prendre la tête :)

Re: Déplacer un dossier - RenameDirectory()

Publié : jeu. 21/nov./2024 17:39
par Mindphazer
Bonjour Jacobus,
merci pour le partage

une petite modification pour rendre la méthode 1 compatible MacOS : remplacer la constante #MB_ICONEXCLAMATION par #PB_MessageRequester_Warning

Je n'ai pas testé la méthode 2 encore :wink:

Re: Déplacer un dossier - RenameDirectory()

Publié : jeu. 21/nov./2024 17:47
par Jacobus
Bonjour MindPhazer
Je n'utilise pas MacOs, tu peux l'adapter pour faire en sorte que cela te serve :)