[Résolu] Comment copier un fichier d'un lecteur à un autre

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

[Résolu] Comment copier un fichier d'un lecteur à un autre

Message par Micoute »

Bonjour à tous,

ça fait un bon moment que je cherche à copier un fichier se trouvant sur une clé USB vers un disque dur en créant d'abord le répertoire qui va le contenir ?

C'est pour cette raison que je me tourne vers vous pour solliciter encore de vos conseils bienveillants, je vous propose mon code que voici:

Code : Tout sélectionner

;XIncludeFile "D:\Programmation\Prg Perso\M\Modules\MesGadgets.pb"

;UseModule MesGadgets

Enumeration
  #Fenetre_principale
EndEnumeration

Enumeration Gadgets
  #Image
  #Txt_Installe
  #Btn_Install_Diag
  #Btn_Quitter
EndEnumeration

Enumeration Polices
  #Arial20
  #Segoe30
EndEnumeration

Enumeration Images
  #ID_Image
EndEnumeration

Global Evenement, ID, Lecteur.s = "", MaCle.s = "", Repertoire.s = "", Fichier.s = "Diagdepiste.exe", fichierSource$ = "", fichierCible$ = ""
;Global.iGadget *Btn_Installe, *Btn_Quitter

;UsePNGImageDecoder()

Procedure.s Detecter_Cle_USB()
  For I = 0 To 25
    Lecteur = Chr(65 + I) + ":"
    ID = ExamineDirectory(#PB_Any, Lecteur, "*")
    If ID
      If GetDriveType_(Lecteur) = #DRIVE_REMOVABLE 
        Break
      EndIf  
      FinishDirectory(ID)
    EndIf
  Next
  ProcedureReturn Lecteur
EndProcedure

Procedure Quitter()
  Select EventType()
    Case #PB_EventType_LeftClick
      CloseWindow(#Fenetre_principale)
      End
  EndSelect    
EndProcedure

Procedure Copier_Repertoire()
  Select EventType()
    Case #PB_EventType_LeftClick
      Repertoire = "D:\AFD50"  ;pour protéger mon ssd, je le crée sur le D: à modifier pour la version finale
      ;If CreateDirectory(Repertoire)
      ;  MessageRequester("INFO", "Le répertoire "+Repertoire+" a été créé avec succès", #PB_MessageRequester_Info)
        
        ;copier diagdepiste.exe de la clé usb, dans le répertoire que nous venons de créer
        MaCle = Detecter_Cle_USB()
        fichierSource$ = MaCle+"\"+Fichier
        fichierCible$ = Repertoire+"\"+Fichier
        Debug "Copie du fichier " + fichierSource$+" vers "+fichierCible$
      ;  Debug CopyFile(fichierSource$, fichierCible$)
      ;EndIf
  EndSelect
EndProcedure
  
  Procedure Programme_principal()
    If OpenWindow(#Fenetre_principale, 450, 200, 400, 400, "Installeur", #PB_Window_BorderLess|#PB_Window_ScreenCentered)
      TextGadget(#Txt_Installe, 10, 10, 380, 40, "Programme d'installation", #SS_CENTER | #SS_CENTERIMAGE)
      ;*Btn_Installe = GadgetCouleurBouton(#Btn_Install_Diag, 10, 80, 380, 40, "Installer DiagDépiste")
      ButtonGadget(#Btn_Install_Diag, 10, 80, 380, 40, "Installer DiagDepiste")
      ;If CatchImage(#ID_Image, ?debut, ?fin - ?debut)
      ;  ResizeImage(#ID_Image, 340,170)
      ;  ImageGadget(#Image, 10, 130, 340, 170, ImageID(#ID_Image))
      ;EndIf  
      ;*Btn_Quitter = GadgetCouleurBouton(#Btn_Quitter, 95, 340, 210, 50, "Q U I T T E R")
      ButtonGadget(#Btn_Quitter, 95, 340, 210, 50, "Q U I T T E R")
      ; Polices
      LoadFont(#Arial20, "Arial Black", 20, #PB_Font_Bold|#PB_Font_HighQuality)
      LoadFont(#Segoe30, "Segoe UI", 20, #PB_Font_Bold|#PB_Font_HighQuality)
      SetGadgetFont(#Txt_Installe, FontID(#Segoe30))
      ;*Btn_Installe\SetGadgetFont(FontID(#Arial20))
      ;*Btn_Quitter\SetGadgetFont(FontID(#Arial20))
      SetGadgetFont(#Btn_Install_Diag, FontID(#Arial20))
      SetGadgetFont(#Btn_Quitter, FontID(#Arial20))
      ;couleurs
      SetWindowColor(#Fenetre_principale, $FEC0BE)
      SetGadgetColor(#Txt_Installe, #PB_Gadget_BackColor, GetWindowColor(#Fenetre_principale))
      ;*Btn_Installe\SetGadgetColor(#PB_Gadget_BackColor, $FBA29A)
      ;*Btn_Installe\SetGadgetColor(#PB_Gadget_FrontColor, $04DBF7)
      ;*Btn_Quitter\SetGadgetColor(#PB_Gadget_BackColor, $0000FF)
      ;*Btn_Quitter\SetGadgetColor(#PB_Gadget_FrontColor, $FFFFFF)
      
      Repeat
        Evenement = WaitWindowEvent()
        Select Evenement
          Case #PB_Event_Gadget
            Select EventGadget()
              Case #Btn_Quitter
                Quitter()
              Case #Btn_Install_Diag
                Copier_Repertoire()
            EndSelect
        EndSelect
      Until Evenement = #PB_Event_CloseWindow
    EndIf
  EndProcedure
  
  Programme_principal()
  
  DataSection
    ;debut:
    ;IncludeBinary "D:\Programmation\Prg Perso\A\AFD50\Projet commun\DiabDepiste\Logo 50_AFD.png"
    ;fin:
  EndDataSection
Dernière modification par Micoute le mer. 23/janv./2019 17:01, modifié 1 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Comment copier un fichier d'un lecteur à un autre

Message par boby »

Je ne comprend pas bien quel est ton problème, est-ce que tu souhaite lister les clef USB afin d'y copier son contenu ?

Code : Tout sélectionner

EnableExplicit
Procedure ListDrives(combo)
  Protected bitmask.l, one.l, LoopCount, Drive$
  bitmask.l = GetLogicalDrives_()
  one.l = 1
  For LoopCount = 0 To 31
    If bitmask & one << LoopCount
      Drive$ = Chr(65+LoopCount)+":"
      If GetDriveType_(Drive$) = #DRIVE_REMOVABLE 
        AddGadgetItem(combo,-1,Drive$)
      EndIf
    EndIf
  Next LoopCount
EndProcedure

Define combo
OpenWindow(0,0,0,300,300,"bla",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
combo = ComboBoxGadget(#PB_Any,200,270,90,20)
TextGadget(#PB_Any,100,270,100,20,"Lecteur source")


ListDrives(combo)
SetGadgetState(combo,0)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Ou est-ce que tu souhaite copier un fichier se trouvant sur la clef depuis laquel tu lance ton "installeur" ? (dans ce cas GetCurrentDirectory() suffit).
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Comment copier un fichier d'un lecteur à un autre

Message par Ollivier »

Bonjour Micoute,

c'est dû à un bug dans ton programme.

La solution pour enlever ton bug :

1) Dans la ligne Global Evenement, ID, etc...
Enlève Lecteur.s

2) Dans la procédure Detecter_Cle_USB()
Rajoute en 1ère ligne

Define Lecteur.S

3) C'est bon. Tu peux prendre un thé ou une verveine...
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment copier un fichier d'un lecteur à un autre

Message par Micoute »

Bonjour à tous,

@boby et tous les autres forumeurs, le programme à installer se trouve sur une clé USB et doit être copié sur un ordinateur, lequel doit reconnaître la clé USB et ouvrir le programme d'installation

@Ollivier, ça ne règle rien, car Debug CopyFile(fichierSource$, fichierCible$) m'affiche 0
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Comment copier un fichier d'un lecteur à un autre

Message par djes »

Un peu plus de debug ou l'utilisation du mode pas à pas aiderait. À lire ton prog dans le train, j'ai vu un truc bizarre dans ta procédure copier(), la variable Fichier est utilisée mais pas déclarée avant...
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Comment copier un fichier d'un lecteur à un autre

Message par boby »

la variable Fichier est utilisée mais pas déclarée avant...

Code : Tout sélectionner

Global Evenement, ID, Lecteur.s = "", MaCle.s = "", Repertoire.s = "", Fichier.s = "Diagdepiste.exe", fichierSource$ = "", fichierCible$ = ""
Je crois que tu as louché :p

Dans ce cas essaie un ça @Micoute (PS: Tu dois cocher l'option demander les droits admin afin de pouvoir copier ton fichier dans le dossier programmes de windob) et ton fichier Diagdepiste.exe dans le même dossier que ton installeur (ou alors modifier le path de SourceFile$).

Code : Tout sélectionner

Procedure Copier_Repertoire()
  Protected ProgramFiles$ = Space(#MAX_PATH), SourceFile$ = GetCurrentDirectory()+"Diagdepiste.exe"
  GetEnvironmentVariable_("PROGRAMFILES", ProgramFiles$, #MAX_PATH)
;   Select EventType()
;     Case #PB_EventType_LeftClick
  Debug SourceFile$
      If CreateDirectory(ProgramFiles$+"\Diagdepiste")
        Debug CopyFile(SourceFile$, ProgramFiles$+"\Diagdepiste\Diagdepiste.exe")
      EndIf
;   EndSelect
EndProcedure
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment copier un fichier d'un lecteur à un autre

Message par Micoute »

Ce n'est pas bon avec GetCurrentDirectory()+"Diagdepiste.exe", car le programme que je compile se trouve dans le même répertoire que le programme Diagdepiste.exe original et l'écrase

Sur l'ordinateur final, l'installateur qui se trouve sur ma clé USB doit créer un répertoire "C:\AFD50" et doit copier le fichier "Diagdepiste.exe" dedans.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Comment copier un fichier d'un lecteur à un autre

Message par Marc56 »

Pour faire quelque-chose de fiable, tu peux (doit) tester la présence d'un répertoire avant copie avec FileSize() qui te retournera -2 si le répertoire existe déjà.
La même commande retourne -1 si un fichier n'existe pas donc si tu peux lancer la copie.

:wink:
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Comment copier un fichier d'un lecteur à un autre

Message par Ollivier »

Crée un répertoire C:\Bigoudi sans Purebasic

Est-ce que ça marche ?

PS: Désolé si la question semble con, mais Microsoft c'est Palladium pour moi.
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Comment copier un fichier d'un lecteur à un autre

Message par boby »

Ce n'est pas bon avec GetCurrentDirectory()+"Diagdepiste.exe", car le programme que je compile se trouve dans le même répertoire que le programme Diagdepiste.exe original et l'écrase
Donc ton "installeur" s'appel lui même Diagdepiste.exe ? Il doit donc se copier lui même ou contient il le Diagdepiste.exe à copier en includebinary ?
Sur l'ordinateur final, l'installateur qui se trouve sur ma clé USB doit créer un répertoire "C:\AFD50" et doit copier le fichier "Diagdepiste.exe" dedans.
Ce n'est pas une solution, si l'utilisateur n'a pas de lecteur appelé C: ça ne fonctionnera jamais, de plus un programme sous windows s'install dans le dossier programme (ou programme X86 le cas échéant) d'où l'exemple que je t'ai donné un poil plus haut servant à trouver le chemin d'accès au dossier "programme" (mais nécessite les droits admin, d'où la case à cocher dans les options du compilot).
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Comment copier un fichier d'un lecteur à un autre

Message par Ar-S »

Cherchez une clé USB automatique ok mais selon la machine cible, elle n'aura pas forcément la même lettre.
Ensuite tu dis que le Prog sur le pc doit
- Detecter la clé
- lancer l'installeur de la clé qui va copier un exe sur le disque dur.
C'est ça ?

Si oui
- Comment se nomme l'exe sur ton PC qui est sensé lancer l'installeur.
- Comment se nomme l'installeur sur la clé
- Comment se nomme l'exe que l'installeur doit copier sur le PC.

Question.
Pourquoi tu t'embêtes avec une clé usb ?
Tu ne vas pas me dire que tu n'as pas un petit espace de stockage en ligne ? Si oui tu pourrais simplement récupérer ton fichier online. Comme ça pas de soucis de Clé, lettres etc..

Lorsque tu fais un installeur (qui ressemble plutôt à un programme de mise à jour), Pour le online je procède comme ça
4 Fichiers :
- Monprogramme.exe
- updater.exe
- MiseAjour.exe qui est la nouvelle version
- version.txt

Udtater.exe est inclus dans Monprogramme.exe
MiseAjour.exe et version.txt sont dans mon espace web.

Lorsque Monprogramme.exe tourne, il vérifie en ligne (via ReceiveHTTPMemory) si son numéro de version est plus petit que le numéro noté dans version.txt
Si OUI, il extrait updater.exe et le lance. Monprogramme.exe se ferme.
- Updater.exe télécharge MiseAjour.exe dans le même dossier que Monprogramme.exe
- Il renomme Monprogramme.exe en Monprogramme.exe.bak (sauvegarde de secours)
- Il renomme ensuite MiseAjour.exe par Monprogramme.exe
- Il supprime Monprogramme.exe.bak
- Il relance (le nouveau) Monprogramme.exe. Updater.exe se ferme
- Monprogramme.exe s'ouvre et la 1ère chose qu'il fait est de supprimer Updater.exe

Le programme est à jour.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment copier un fichier d'un lecteur à un autre

Message par Micoute »

@Ar-s, oui, c'est bien ça.

le nom de l'exe sur la clé USB se nomme Installeur diagdepiste.exe
le nom de l'exe que l'installeur doit copier sur le disque dur se nomme Diagdepiste.exe

je m'embêtes avec une clé USB parce que les ordinateurs en question sont des laptops et que je n'en possède pas.
Je sais que je pourrais mettre les fichiers à installer dans ma Dropbox et donner l'adresse internet, mais il y a rarement internet sur les marchés.

Après, je suis perdu, car je n'ai pas toute ta science et ce ne me facilite pas du tout la vie.

j'ai vérifié que la clé s'appelle "J:", le répertoire où copier s'appelle "D:\AFD50", car je fais mes essais sur une disque pour protéger mon SSD et dans les deux cas le fichier se nomme "Diagdepiste.exe"
J'ai fait Debug CopyFile(fichierSource$, FichierDestination$) ça me renvoie 0
J'ai fait Debug CopyFile("J:\Diagdepiste.exe", "D:\AFD50\Diagdepiste.exe") et la réponse est 0

Re édition
par contre j'ai fait Debug CopyDirectory(MaCle, Repertoire, "*.*"), ça fonctionne, mais ça copie tout les fichiers se trouvant sur ma clé
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Comment copier un fichier d'un lecteur à un autre

Message par Marc56 »

Si tu lances ton programme d'installation depuis la clé usb et que le programme à installer s'y trouve aussi, alors il est inutile de mettre le chemin complet des fichiers source.
Seul le nom de destination a besoin du chemin complet.

Code : Tout sélectionner

EnableExplicit 

Define Fichier_Source$          = "Diagdepiste.exe"
Define Fichier_Destination$ 	  = "Diagdepiste.exe"
Define Repertoire_Destination$  = "D:\AFD50"

If FileSize(Repertoire_Destination$) <> -2 
    If CreateDirectory(Repertoire_Destination$)
        MessageRequester("Succès", "Répertoire créé" + #CRLF$ + #CRLF$ + Repertoire_Destination$)
    Else
        MessageRequester("Erreur", "Impossible de créer" + #CRLF$ + #CRLF$ + Repertoire_Destination$)
        End
    EndIf
EndIf
    
If CopyFile(Fichier_Source$, Repertoire_Destination$ + "\" + Fichier_Destination$)
    MessageRequester("Succès", "Programme installé.")
Else
    MessageRequester("Erreur", "Programme non copié.")
EndIf
Autre possibilité: laisser l'utilisateur choisir ou créer un répertoire. (utilisation de PathRequester())
Ici, si le répertoire D:\AFD50 existe déjà alors il pointe dessus.

Code : Tout sélectionner

EnableExplicit 

Define Fichier_Source$          = "Diagdepiste.exe"
Define Fichier_Destination$ 	= "Diagdepiste.exe"
Define Repertoire_Destination$  = PathRequester("", "D:\AFD50")
    
If CopyFile(Fichier_Source$, Repertoire_Destination$ + "\" + Fichier_Destination$)
    MessageRequester("Succès", "Programme installé.")
Else
    MessageRequester("Erreur", "Programme non copié.")
EndIf
J'ai fait Debug CopyFile(fichierSource$, FichierDestination$) ça me renvoie 0
:!: Syntaxe à éviter pour produire l'EXE final, car tout ce qui se trouve derrière Debug sera ignoré, donc pas de copie des fichiers
Faire If CopyFile(fichierSource$, FichierDestination$) <> 0

:idea: Conseils perso.
- Ne mettre qu'une variable par ligne dans les déclarations de variable, c'est plus lisible
- Utiliser le suffix $ pour les variables chaines de caractère plutôt que .s ainsi pas besoin de se rappeler le type et pas d'erreur d'oubli de transtypage.

:wink:
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Comment copier un fichier d'un lecteur à un autre

Message par Ar-S »

Code : Tout sélectionner

utilisation de PathRequester()
C'est le plus censé ! Si pour une raison X ou Y la lettre du lecteur de destination change, ça plante tout ton programme.
Une PathRequester() ça prend qques sec et au moins l'utilisateur sait et voit ou le programme se copie.

Note : Micoute, ça parait évidement mais, au cas ou,je te rappelle que vu que les 2 exe ont le même nom. Il faut que Diagdepiste.exe du PC soit fermé avant de procéder à la copie USB vers PC
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment copier un fichier d'un lecteur à un autre

Message par Micoute »

Grand merci à tous pour l'aide précieuse que vous m'avez apportée

@Marce56, ta méthode me semble très efficace et je vais l'adopter

@Ar-s, évidemment que Diagdepiste.exe sera fermé, puisqu'au moment on l'installe, il n'existe pas encore sur le disque dur receveur et que le programme d'installation est un fichier différent, mon seul problème c'est que mon programme ne comprend pas ce que je veux qu'il fasse.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre