Page 1 sur 1

CopyDirectory, comprend pas ou ça queute

Publié : dim. 10/juin/2007 22:33
par Ar-S
Salut les amis,

Encore un petit truc que je pige pas.

Je veux faire en sorte qu'en cliquand sut un bouton,
un repertoire A et son contenu soient copiés à un endroit B

J'utilise donc CopyDirectory mais j'obtiens mon message d'erreur (du Else)
et je ne vois pas pourquoi vu que j'ai créé les repertoires et que j'y ai mis 2 fichiers txt pour tester le programme.

Voilà la partie en question :

Code : Tout sélectionner

  If EventGadget = #Bouton_Ouvrir
        If CopyDirectory("c:\test\", "c:\test2\", "", #PB_FileSystem_Recursive | #PB_FileSystem_Force)
          MessageRequester ("info","La copie a été réalisée")
        Else
          MessageRequester ("info","Erreur, copie impossible, vérifier que le reseau fonctionne et que les fichiers soient disponibles")
        EndIf 
      EndIf
A terme je voudrais faire en sorte que mon programme copie un repertoire sur un reseau vers un PC maitre (pas serveur, juste le pc du boss)
tous les vendredi, à 9h du matin.
Un genre de mini backup automatique quoi.

Ce qui m'amène à ma seconde question.
Avec CopyDirectory, peut on copier des fichiers d'un pc en resau en utilisant la syntaxe \\nomdupcsur_reseau\repertoir\etc... ?

D'avance merci
:twisted:

Publié : dim. 10/juin/2007 22:56
par Backup
au lieu de "" comme masque , met "*.*"

CopyDirectory("c:\test\", "c:\test2\", "*.*", #PB_FileSystem_Recursive | #PB_FileSystem_Force)


pour la deuxieme question, je pense que oui !!

puisque la fonction accepte les jocker, elle doit aussi accepter tout les chemin s :D

Publié : dim. 10/juin/2007 23:04
par Cls
Après quelques tests, il semblerait que si le répertoire destination existe déjà, le répertoire source n'est pas copié et la fonction renvoi 0.

A la place tu peux utiliser le code suivant :

Code : Tout sélectionner

Procedure Copy(source.s, destination.s, rek = 0) ; Source, Destination, indice
  ; Ajoute le "\"
  If Right(destination, 1) <> "\" : destination + "\" : EndIf
  
  If ExamineDirectory(rek, source, "*")
    While NextDirectoryEntry(rek)
      name.s = DirectoryEntryName(rek) : type = DirectoryEntryType(rek)
      
      Select type         
        Case #PB_DirectoryEntry_File
          Debug source + name
          CopyFile(source + name, destination + name)
          
          
        Case #PB_DirectoryEntry_Directory
          If name <> "." And name <> ".."
            Copy(source + name + "\", destination, rek+1)
          EndIf     
      EndSelect
    Wend
    FinishDirectory(rek)
  EndIf
EndProcedure
Cordialement,
Cls

Publié : dim. 10/juin/2007 23:10
par Cls
Dobro a écrit :au lieu de "" comme masque , met "*.*"
Chez moi, ca ne marche pas non plus.

Publié : lun. 11/juin/2007 6:35
par Backup
Cls a écrit :Après quelques tests, il semblerait que si le répertoire destination existe déjà, le répertoire source n'est pas copié et la fonction renvoi 0.
alors ça doit etre un bug a signaler a Fred ça .. :)
Cls a écrit :
Dobro a écrit :au lieu de "" comme masque , met "*.*"
Chez moi, ca ne marche pas non plus.
c'etait une idée, j'ai pas testé :oops: :lol:

Publié : lun. 11/juin/2007 9:02
par Jacobus
C'est le " \ " du répertoire de destination qu'il faut enlever, sinon tu essayes de copier dans un dossier inexistant, d'où l'erreur.

comme ça :

Code : Tout sélectionner

CopyDirectory("c:\test\", "c:\test2", "*.*", #PB_FileSystem_Recursive | #PB_FileSystem_Force)

Publié : lun. 11/juin/2007 10:22
par brossden
Exact la remarque de Jacobus est bonne j'ai vérifié chez moi tout est OK !

Merci Jacobus !

Code : Tout sélectionner

    If CopyDirectory("c:\test", "c:\test2", "", #PB_FileSystem_Recursive | #PB_FileSystem_Force)
      MessageRequester ("info","La copie a été réalisée")
    Else
      MessageRequester ("info","Erreur, copie impossible, vérifier que le reseau fonctionne et que les fichiers soient disponibles")
    EndIf

Publié : lun. 11/juin/2007 12:08
par Cls
Ah oui effectivement, je n'avais pas pensé à enlever le "\".
Bien vu Jacobus !

Publié : lun. 11/juin/2007 12:13
par Ar-S
Merci à tous pour vos réponses et à Jacobus pour avoir trouvé la coquille.

Par contre faudrait corriger dans l'aide officiel (fichier du 08/02/2007) car la donction CopyDirectory est représentée comme cela :

Code : Tout sélectionner

Debug CopyDirectory("D:\Games\MyGame\", "D:\Games\Backup\", "", #PB_FileSystem_Recursive)
D'ou mon erreur de \

Publié : lun. 11/juin/2007 21:43
par Ar-S
Encore une petite chose qui me contrarie,

dans ma procédure

Code : Tout sélectionner

Procedure Copie_Rep ()
  If CopyDirectory("c:\test", "c:\test2", "*.*", #PB_FileSystem_Recursive | #PB_FileSystem_Force)
    SetGadgetText (#Message_Affiche,"Sauvegarde réalisé avec succes")
   Else
    SetGadgetText (#Message_Affiche,"Erreur, copie impossible,"+Chr(10)+ "vérifier que le reseau fonctionne et que les fichiers soient disponibles")
  EndIf
EndProcedure
J'aimerai que le message Sauvegarde réalisé avec succes s'affiche une fois le transfert terminé (histoire d'être sûr) or là il s'affiche dés que la copie commence.

Comment palier à ce problème ?
J'ai vu WaitThread(Thread) dans l'aide mais je pige pas trop son fonctionnement ni si ça correspond bien à ce que je veux..

Publié : mar. 12/juin/2007 0:15
par Cls
Ar-S a écrit : J'aimerai que le message Sauvegarde réalisé avec succes s'affiche une fois le transfert terminé (histoire d'être sûr) or là il s'affiche dés que la copie commence.
Pour ca, je vois 2 solutions.

Soit tu comptes le nombre de fichier du répertoire source et tu compares avec le nombre de fichiers présent dans le répertoire destination. Pour ca il faut que tu sois sûr que le réperoire destination soit vide à chaque fois (répertoire différent à chaque sauvegarde ou suppression préalable des données). Je ne crois pas que c'est ce que tu cherches à faire...

Soit tu compares les fichiers des répertoires sources et destinations.
Voilà ce que je peux te proposer. Je l'ai testé chez moi, ca marche. Il y a peut - être (surement) plus simple.

Le code :

Code : Tout sélectionner

; Permet de copier 2 répertoires et attends jusqu'à ce que la copie soit effectuée
; ou qu'un TimeOut se déclenche
; -----------------------------
; Auteur : Cls
; Version : 12 Juin 2007
; -----------------------------

; Compare le contenu de 2 répertoires
; Renvoi le nombre de fichiers copiés 
Procedure.l Compare_Directory(source.s, destination.s, rek = 0) ; Source, Destination, indice 
  res.l
  
  ; Ajoute les "" 
  If Right(destination, 1) <> "" : destination + "" : EndIf 
  If Right(source, 1) <> "" : source + "" : EndIf
  
  If ExamineDirectory(rek, source, "*") And ExamineDirectory(rek + 1, destination, "*")
    While NextDirectoryEntry(rek) 
      ; Nom & Type répertoire source
      s_name.s = DirectoryEntryName(rek) : s_type = DirectoryEntryType(rek) 
      
      ; Teste si il y a encore une entrée dans le répertoire destination. Si non, renvoi Faux.
      If NextDirectoryEntry(rek+1) = 0
        ProcedureReturn 0
      EndIf
      
      ; Nom & Type répertoire destination
      d_name.s = DirectoryEntryName(rek + 1) : d_type = DirectoryEntryType(rek + 1) 
      
      Select s_type          
        Case #PB_DirectoryEntry_File 
          s_fullname.s = source + s_name
          d_fullname.s = destination+ d_name
          
          If s_name = d_name            
            res + 1
          EndIf                  
          
        Case #PB_DirectoryEntry_Directory 
          If s_name <> "." And s_name <> ".." 
            res + Compare_Directory(source + s_name + "", destination + d_name + "", rek + 2) 
          EndIf      
      EndSelect 
    Wend 
    
    ;Libère la mémoire
    FinishDirectory(rek) 
    FinishDirectory(rek + 1)
    
  EndIf 
  
  ProcedureReturn res
EndProcedure

; Lance le thread comparant les 2 répertoires
Procedure Compare_DirectoryThread(mem.l)
  ; Récupère les paramètres du thread
  source.s = PeekS(mem + 4) ; on lit un string a partir de mem + 4 
  destination.s = PeekS(mem + Len(source) + 5) 
  delay = PeekL(mem) ; long codé sur 4 byte
  
  a = ElapsedMilliseconds()
  
  ; Test le fin du transfert ou le timeOut
  While Compare_Directory(source, destination) < 1 Or b - a > delay
    b = ElapsedMilliseconds()
  Wend
  
EndProcedure

;- [Configuration de la copie]

Delay = 50 * 1000 ; Le timeout en millisecondes (ici 50 seondes)
Source.s = "C:\Test" ; Le répertoire source à copier
Destination.s = "C:\Test2" ; Le répertoire destination


; Zone mémoire permettant de configurer le thread (Delay, Source, Destination)
*buf = AllocateMemory(4096)
PokeL(*buf, Delay) ; 3000ms de delay
PokeS(*buf + 4, Source) 
PokeS(*buf + Len(Source) + 5, Destination)


;- [Lancement de la copie]

debut = ElapsedMilliseconds()
CopyDirectory(Source, Destination, "*.*", #PB_FileSystem_Recursive | #PB_FileSystem_Force)
; Lance le thread permettant de savoir si le répertoire est copié
CreateThread(@Compare_DirectoryThread(), *buf)
fin = ElapsedMilliseconds()

delta = fin - debut

;- [Message]
If delta > Delay
  MessageRequester("Erreur", "Erreur lors du transfert.")
Else
  MessageRequester("Ok", "Fichiers copiés avec succès en " + Str(delta) + " ms.")
EndIf
Edit : Je viens de me rendre compte en me relisant que le thread ne servait à rien, j'avais commencé à faire autrement puis j'ai changé... :roll:
Comme j'ai la flemme de remodifier le code je le laisse tel quel. :D

Cordialement,
Cls