[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
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message par Ar-S »

Heu donc tu veux faire un copier / coller quoi...
Tu ne crois pas que "clic droit copié" clic droit coller" irait plus vite.. Je suis sérieux là..
Ou alors tu vends la clé aux "clients" ? Dans ce cas là pourquoi ne lancent ils pas directement le logiciel de la clé..
Faire un "pseudo" installeur pour un soft portable contenant 1 sul fichier (voir un seul dossier) je cherche mais je ne comprends pas l’intérêt là si ce n'est alourdir le programme.
~~~~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
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

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

Message par Marc56 »

Penser à l'audience: tous les utilisateurs ne sont pas informaticiens et certains viendront (je pense) avec une clé usb pour installer plus tard. Parfois, le simple fait d'ouvrir « l'explorateur » (?) faire copié (?) coller (?) n'est pas évident.
Créer un programme de setup complet est assez difficile. Ça l'est un peu moins avec 7z ou WinRar, mais quand même.

Ces deux derniers savent créer un installeur complet avec pour WinRar même un raccourci sur le bureau.

Pour améliorer le programme, il serait donc bien de faire une icône sur le bureau qui pointera sur le répertoire où est installé le programme.

On peut faire ce raccourci avec une API ou avec la commande Windows mklink

Code : Tout sélectionner

EnableExplicit

Define Program_Title$   = "Diag de piste"
Define Program_EXE$     = "Diagdepiste.exe"
Define Program_Rep$     = "D:\AFD50"

SetCurrentDirectory(GetUserDirectory(#PB_Directory_Desktop))

RunProgram("cmd", "/c mklink "      +
                  #DQUOTE$          +
                  Program_Title$    +
                  #DQUOTE$          +
                  " "               +
                  #DQUOTE$          +
                  Program_Rep$      + 
                  "\"               + 
                  Program_EXE$      +
                  #DQUOTE$,
           "")

End
:wink:
Dernière modification par Marc56 le mar. 22/janv./2019 17:47, modifié 2 fois.
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 »

Je finis pas m'embrouiller, car la manœuvre c'est : je crée bénévolement un logiciel de dépistage du diabète et pour nourrir la base de données, d'autres bénévoles vont là où on rencontre les gens, c'est à dire sur les foires et les marchés et pour saisir les données ils ont chacun un laptop sur lequel je souhaite créer un logiciel pour installer le logiciel de dépistage dessus et pour cela, je veux mettre le logiciel installeur, le logiciel de dépistage qui se lancera en cliquant sur une icône, les bases de données de chacun seront sur une clé individuelle et seront regroupées en une seule base dans l'ordinateur principal.
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 »

Si tu mets ton logiciel et l'installateur du logiciel de dépistage au même endroit (sur la clef), tu peux utiliser le chemin de ton logiciel, plutôt que d'essayer de chercher le chemin de la clef...
https://www.purebasic.com/documentation ... ename.html
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

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

Message par boby »

Sous window, un programme s'installe dans... Programme (Et si vous prettez une attention tout particulière, vous pouvez identifier une subtile resemblence entre programme et programme). Pour obtenir le dossier programme, il existe les variable d'environement :

Code : Tout sélectionner

Define ProgramFiles$ = Space(#MAX_PATH)
GetEnvironmentVariable_("PROGRAMFILES", ProgramFiles$, #MAX_PATH)
Debug ProgramFiles$
(Pour avoir les droits d'écriture dans le dossier programme, il faut demander les droits administrateur à l'utilisateur.)

Il est conseillé de donner le choix à l'utilisateur de choisir où installer son programme (si c'est un débil qui se prend pour un informaticien libre à lui), pour ça effictivement un pathrequester fait le boulot.

Mais en fait, tu n'as que ton exe à "installer" ? Pourquoi tu ne dit pas simplement "Tiens copi l'exe Ton_App.exe et ça marchera" ?
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

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

Message par Marc56 »

Pas besoin d'API GetEnvironmentVariable() existe nativement en PB. D'ailleurs tous les langages de programmation ont des fonctions pour lire et définir les variables d'environnement puisque c'est indispensable notamment au chainage de programmes (ex: un batch qui lance un exécutable pour redéfinir avant un autre environnement temporaire)
Donc une seule ligne:

Code : Tout sélectionner

Debug GetEnvironmentVariable("ProgramFiles")
Et pour un programme simple ne comportant qu'un seul EXE, il est plus simple de l'installer dans un sous-dossier de "Mes Documents" (lui aussi accessible avec les fonctions natives de PB GetUserDirectory(). Ainsi pas besoin d'avoir de droits d'admin et le programme et ses données seront sauvegardées par tout système de backup utilisateur.

Code : Tout sélectionner

Debug GetUserDirectory(#PB_Directory_Documents)
:wink:
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,

même codé en dur, ça ne fonctionne pas :

Code : Tout sélectionner

Procedure.s Detecter_Cle_USB()
  Define Lecteur.s
  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 Copier_Repertoire()
  ;pour protéger mon SSD, je le crée sur le D: à modifier pour la version finale
  Select EventType()
    Case #PB_EventType_LeftClick
      RepertoireSource$ = Detecter_Cle_USB()
      If FileSize(RepertoireDestination$) <> -2
        If CreateDirectory("D:\AFD50")
          MessageRequester("Succès", "Répertoire " + RepertoireDestination$ + " créé")
        Else
          MessageRequester("Erreur", "Impossible de créer " + RepertoireDestination$)
          End
        EndIf
        SetCurrentDirectory(RepertoireSource$)
        Debug GetCurrentDirectory()
        If CopyFile("Diagdepiste.exe", "D:\AFD50\Diagdepiste.exe")
          MessageRequester("Succès", "Programme installé.")
        Else
          MessageRequester("Erreur", "Programme non copié.")
          DeleteDirectory("D:\AFD50", "*.*", #PB_FileSystem_Force)
        EndIf
      EndIf
  EndSelect
EndProcedure
Si la copie ne s'effectue pas, je supprime le répertoire afin de pouvoir le recréer à la prochaine tentative.

Je n'oublie de vous remercier.
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 : 2148
Inscription : sam. 08/févr./2014 15:19

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

Message par Marc56 »

Bonjour Micoute,

Tu n'as pas besoin de déterminer la lettre du lecteur USB puisque ton programme sera lancé depuis le lecteur lui-même. Donc pour mettre au point ton programme, tu dois le compiler, mettre l'EXE sur la clé et lancer cet exe.
Ou
Tu peux copier ton fichier source (.pb) sur la clé (de test) puis paramétrer les options du compilateur pour "Créer l’exécutable temporaire dans le répertoire des sources"

PS. Avec SetCurrentDirectory("C:") ne pas oublier l'antislash ('\') sinon, on change de disque mais pas de répertoire et c'est le dernier répertoire utilisé par chaque disque qui est utilisé.

Code corrigé: Tu avais mal imbriqué If/EndIf pour If FileSize(Repertoire) <> -2 rien ne se passait si le répertoire de destination existait déjà.
Beaucoup de code en trop aussi: pas besoin de tester le bouton gauche puisque c'est le bouton par défaut.

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

; UsePNGImageDecoder()
; Global ID, Lecteur.s = "", MaCle.s = "", Repertoire.s = "", Fichier.s = "Diagdepiste.exe", fichierSource$ = "", fichierCible$ = ""

Global Fichier.s    = "Diagdepiste.exe"
Global Repertoire.s = "D:\AFD50"



Procedure Copier_Repertoire()
    If FileSize(Repertoire) <> -2
        Debug "Le répertoire de destination n'existe pas."
        If CreateDirectory(Repertoire)
            MessageRequester("Succès", "Répertoire: " + 
                                       Repertoire + " créé.")
        Else
            MessageRequester("Erreur", "Impossible de créer le répertoire: " + 
                                       Repertoire)
            End
        EndIf
    EndIf    
    Debug "Répertoire courant: " +  GetCurrentDirectory()
    
    If CopyFile(Fichier, Repertoire + "\" + Fichier)
        MessageRequester("Succès", "Programme installé.")
    Else
        MessageRequester("Erreur", "Programme non copié.")
        DeleteDirectory(Repertoire, "*.*", #PB_FileSystem_Force)
    EndIf
EndProcedure

OpenWindow(#Fenetre_principale, 450, 200, 400, 400, "Installeur", #PB_Window_BorderLess|#PB_Window_ScreenCentered)
TextGadget(#Txt_Installe, 10, 10, 380, 40, "Programme d'installation", #PB_Text_Center)
ButtonGadget(#Btn_Install_Diag, 10, 80, 380, 40, "Installer DiagDepiste")
ButtonGadget(#Btn_Quitter, 95, 340, 210, 50, "Q U I T T E R")
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))
SetGadgetFont(#Btn_Install_Diag, FontID(#Arial20))
SetGadgetFont(#Btn_Quitter, FontID(#Arial20))
SetWindowColor(#Fenetre_principale, $FEC0BE)
SetGadgetColor(#Txt_Installe, #PB_Gadget_BackColor, GetWindowColor(#Fenetre_principale))

Repeat
    Select WaitWindowEvent()
            
        Case #PB_Event_Gadget
            Select EventGadget()
                Case #Btn_Quitter
                    End
                Case #Btn_Install_Diag
                    Copier_Repertoire()
            EndSelect
            
        Case #PB_Event_CloseWindow
            End
            
    EndSelect
ForEver


DataSection
    ;debut:
    ;IncludeBinary "D:\Programmation\Prg Perso\A\AFD50\Projet commun\DiabDepiste\Logo 50_AFD.png"
    ;fin:
EndDataSection
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 »

Merci beaucoup Marc56,

j'avais déjà trouvé la solution grâce à ton aide en particulier, car tu as compris ce que je voulais faire et je m'aperçois que ton code est plus court pour arriver au même résultat, alors je te remercie une fois de plus.

je teste le bouton gauche, car j'utilise un module qui me contraint à le faire, car l'opération se déclenche quand la souris passe sur le gadget et c'est juste une protection pour l'action soit volontaire.

Pour la boucle j'avais remarqué aussi, et si la copie ne se s'effectuait pas, j'effaçais le répertoire que je venais de créer, car sur les laptops finaux, le répertoire ne peut pas déjà exister.
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