Page 1 sur 1

CopyDirectory

Publié : jeu. 04/août/2005 19:55
par Jacobus
Salut à vous tous,
Besoin de vos yeux aguérris et de vos compétences pour résoudre un petit blème.
Pour archiver dossiers et fichiers :
Pour copier un dossier et son contenu j'ai un souci qui fait que si l'utilisateur veux Re-copier une seconde fois le dossier, se trouve dans l'impossibilité de le faire par dessus le précédent. le seul moyen semble de renommer le dossier de destination.

Le code des procédures que j'utilise (un peu épuré mais fonctionnel)

Une procédure qui est sensée vérifiée l'existence du dossier à copier dans le répertoire des archives et donc le signaler à l'utilisateur.

Code : Tout sélectionner

Procedure ExistArchive(NomArchive$,MCdirectory$)
  ExamineDirectory(#PB_Any,MCdirectory$,"*.*")
  Repeat
    FileType = NextDirectoryEntry()
    If FileType
      DossierArchive$ = DirectoryEntryName()
      If FileType = 2 ; s'il s'agit d'un dossier
        If NomArchive$ = DossierArchive$
          ProcedureReturn 1
        EndIf
      EndIf
    EndIf
  Until FileType = 0 
  ProcedureReturn 0
EndProcedure
Puis la procédure de copie proprement dite qui inclue la précédente et doit logiquement renvoyé un MessageRequester si le dossier existe déjà.

Code : Tout sélectionner

Procedure Archivage()
  RepSource$ = "C:\DossierTest\"
  RepDestination$ = SaveFileRequester("Modifiez le n° de l'archive puis Enregistrez la","C:\ARCHIVES\ARCHIVE_01","*.*",0) 
  CreerArchive = #True
  If ExistArchive(RepDestination$,"C:\ARCHIVES\") = 1 
    If FileSize(RepDestination$)>0
      Reponse = MessageRequester("Ce dossier existe déjà !","Voulez vous remplacer le dossier :   " + RepDestination$ + " ?  Il a déjà été enregistré !" ,#PB_MessageRequester_YesNo ) 
      If Reponse = 6
        a$ + "Yes"
      Else 
        Reponse = 7
        a$ + "No" 
        If Reponse <> 6 
          CreerArchive = #False 
        EndIf 
      EndIf 
    EndIf  
  EndIf  
  If CreerArchive   
    Resultat = CopyDirectory(RepSource$, RepDestination$,"*.*",#PB_FileSystem_Recursive)   
    If Resultat = 0
      MessageRequester("ERREUR !", "IMPOSSIBLE DE COPIER LES FICHIERS !"+Chr(13)+""+Chr(13)+"LA SAUVEGARDE DE CE DOSSIER A ECHOUE !",#MB_ICONWARNING | #PB_MessageRequester_Ok )
    Else  
      MessageRequester("TRANSFERT TERMINE !", "LES FICHIERS ET DOSSIERS ONT ETE CORRECTEMENT COPIES."+Chr(13)+""+Chr(13)+"L'ARCHIVAGE EST REUSSIE!",#MB_ICONINFORMATION | #PB_MessageRequester_Ok)          
    EndIf 
  EndIf 
EndProcedure 
Le problème est que même si le dossier existe déjà le message n'est pas renvoyé, et l'enregistrement avec le même nom ne peut se faire que dans un autre répertoire. Le SaveFileRequester ouvre alors le dossier existant du même nom que celui que l'on veut re-copier.
D'où ma perplexité, car j'ai l'impression de ne rien avoir oublié...ce qui n'est manifestement pas le cas. :?

Cependant, la copie se fait correctement si on change le nom du dossier à enregistrer... :(

Bah voilà, si vous voyois où je merdois, merci de me le faire voir
@+

Publié : jeu. 04/août/2005 20:08
par gansta93
Moi c le FileSçize qui me lesse perplex, pourquoi fair >0 pour un répertoir ?
Je n'ai pas bien regardé le code, j'ai peut-être mal lu.

Publié : jeu. 04/août/2005 20:13
par Jacobus
C'est vrai qu'il ne change rien au problème. En le mettant >0 ou = -2 c'est pareil.
La procédure n'en tient pas compte...

Publié : jeu. 04/août/2005 22:12
par Backup
cela correspond surement au probleme que j'avais soulevé ici
http://purebasic.hmt-forum.com/viewtopic.php?t=2762

ou je me rend compte que apres avoir ouvert un fichier dans une dll
il y a impossibilité d'effacer ce fichier meme apres un CloseFile(#Fichier)
car la dll n'etant toujours en action windows bloc l'acces a ce fichier !
du coup toute creation de fichier a partir d'une dll , ne peut etre effacé
par le programme appelant la dite dll !!!



peut etre que pour tes dossiers il se passe une chose similaire

le dossier ayant ete crée par le prg , doit etre locké par windows
qui protegel' acces a ce dossier (non libre tant que le prg est actif en ram !)

du coup lorsque le prg veut reecrire le dossier , il est possible qu'il ne puisse le faire a cause de windows !!

pour moi la cause est que le purebasic ne libere pas vraiment les fichiers
(pour un effacement par exemple) et ce malgres un CloseFile(#Fichier)

:?

c'est mon analyse .....



:?

Publié : jeu. 04/août/2005 22:19
par KarLKoX
Effectivement, s'il y a impossibilité de supprimer un fichier apres ouverture/fermeture dudit fichier depuis un éxécutable c'est différent depuis une DLL), Purebasic peut avoir un problème de libération du fichier.

Publié : jeu. 04/août/2005 23:14
par Jacobus
J'ai relu ton topic Dobro et je ne rencontre pas le problème avec DeleteFile() ou DeleteDirectory() qui effacent bien les fichiers et les dossiers que je veux et quand je veux ( XP home sp2 ) et cela me surprend qu'il y ait des différences aussi importantes entre deux machines. (J'utilise toujours PB 3.93)

Pour CopyDirectory() comme le dit la doc, il devrait écraser le dossier s'il porte le même nom, mais nada : refusé!
Windows t'ouvre un autre répertoire...Quelle tête de lard!! :mad:

Or CopyFile() ne pose pas de problème. Un fichier copié peut l'être plusieurs fois, même après l'avoir ouvert, lu, fermé, modifié.

J'ai l'impression que c'est la fonction CopyDirectory() qui merdouille et contrairement à ce que dit la doc, n'écrase pas le dossier s'il existe, mais force la copie ailleurs, pour le protéger sans doute.

Ce serait bien de savoir si ça fait pareil à tout le monde ou pas.
J'ai essayé plusieurs méthodes, hors procédure en mettant les fonctions sur un Case, avec #PB_FileSystem_Recursive|#PB_FileSystem_Force, en limitant au maximum les instructions, mais rien n'y fait.
:roll:

Publié : ven. 05/août/2005 0:34
par Backup
ouaip !

ben met le en rubrique Bug alors , car tu doit avoir raison ! ... :? :)

Publié : ven. 05/août/2005 2:42
par KarLKoX
Jacobus>je confirme pour CopyDirectory, j'ai fait pour quelqu'un une application qui copie/déplace récursivement un dossier*, j'ai tout fait à la main, si tu n'en veux, fait moi signe ;)


* il manque juste la vérification de la place dispo avant copie/déplacement

Publié : ven. 05/août/2005 18:29
par Jacobus
@KarlKoX, Oui ça m'intéresse. Je t'envoie un mp.

@Dobro, c'est peut-être un bug mais je n'en suis pas sûr... je commence également à avoir des doutes sur le SaveFileRequester() car si on utilise pas ce dernier et que l'on nomme le répertoire de destination dans CopyDirectory(), ça fonctionne, le dossier est bien écrasé et réécrit. Le problème c'est que de cette façon ça limite considérablement les possibilités.

de cette manière, donc sans procédure mais sur un simple bouton :

Code : Tout sélectionner

Case #btn_CreateArchive
RepSource$ = "C:\DossierTest\"
RepDestination$ = "C:\ARCHIVES\"
Resultat = CopyDirectory(RepSource$, RepDestination$,"*.*",#PB_FileSystem_Recursive)
If Resultat = 0
      MessageRequester("ERREUR !", "IMPOSSIBLE DE COPIER LES FICHIERS !"+Chr(13)+""+Chr(13)+"LA SAUVEGARDE DE CE DOSSIER A ECHOUE !",#MB_ICONWARNING | #PB_MessageRequester_Ok )
    Else  
      MessageRequester("TRANSFERT TERMINE !", "LES FICHIERS ET DOSSIERS ONT ETE CORRECTEMENT COPIES."+Chr(13)+""+Chr(13)+"L'ARCHIVAGE EST REUSSIE!",#MB_ICONINFORMATION | #PB_MessageRequester_Ok)          
    EndIf 
Ce qui ne laisse guère de choix à l'utilisateur :?

Publié : ven. 05/août/2005 18:48
par Backup
dans ce cas ton probleme s'eloigne du mien !!

car dans mon "bug" je n'utilise pas de SaveFileRequester() :D