Déplacer un dossier - RenameDirectory()

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Déplacer un dossier - RenameDirectory()

Message 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 :)
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.
Avatar de l’utilisateur
Mindphazer
Messages : 694
Inscription : mer. 24/août/2005 10:42

Re: Déplacer un dossier - RenameDirectory()

Message 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:
Bureau : Win10 64bits
Maison : Macbook Pro M3 16" SSD 512 Go / Ram 24 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Déplacer un dossier - RenameDirectory()

Message par Jacobus »

Bonjour MindPhazer
Je n'utilise pas MacOs, tu peux l'adapter pour faire en sorte que cela te serve :)
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.
Répondre