Page 1 sur 1
[..] Copie de fichiers vers une clé usb
Posté : jeu. 19 mars 2015 20:45
par Jonathan
Bonjour à tous,
Je débute en programmation Autoit et je souhaiterai créer un petit programme (s'il n'existe pas déjà) qui me permetrait dès lors que je branche ma clée usb sur mon ordinateur de copier tous les fichier .pdf vers un dossier spécialement prévu à cet effet sur ma clé, et ce automatiquement, et vice versa.
Est-ce possible ? Pourriez vous m'expliquer comment procéder ?
Merci.
Re: copie de fichiers vers une clé usb
Posté : jeu. 19 mars 2015 20:59
par jguinch
Merci de modifier le titre du message afin qu'il respecte les
règles de présentation d'un message.
Pour exécuter une action à l'insertion d'un clé USB, il y a des exemples sur le forum (recherche le terme
WM_DEVICECHANGE)
Re: [..] Copie de fichiers vers une clé usb
Posté : jeu. 26 mars 2015 12:45
par TomAijerrie
Voici un début de script qui semble correspondre à tes besoins
► Afficher le texte
Code : Tout sélectionner
#include <array.au3>
#include <File.au3>
$WM_DEVICECHANGE = 0x0219
$DBT_DEVICEARRIVAL = 0x8000
$DBT_DEVTYP_VOLUME = 2
Global $DriveLetter
Global $dirCopy = @MyDocumentsDir & "\PDF\"
Global $Acur = DriveGetDrive("All")
Global $Alast = $Acur
Global $Alistefile[0]
While 1
Sleep(1000)
$Acur = DriveGetDrive("All")
If $Acur[0] > $Alast[0] Then
Local $Stmp = ""
For $i = 1 To $Alast[0]
$Stmp &= $Alast[$i]
Next
For $i = 1 To $Acur[0]
If Not StringInStr($Stmp,$Acur[$i]) Then
$DriveLetter = $Acur[$i]
MsgBox(0, "Insertion détectée", "Lecteur " & $DriveLetter,15)
If MsgBox(4,"","Voulez vous copier tous les fichiers PDF de la clef ?") = 7 Then Exit
listDossier($DriveLetter)
copieA($Alistefile)
ExitLoop
Else
ContinueLoop
EndIf
Next
EndIf
$Alast = $Acur
WEnd
Func listDossier($path)
$Atmp = _FileListToArrayRec($path & "\","*",2,1,0,2)
For $i = 1 To UBound($Atmp) -1
listFile($Atmp[$i])
Next
EndFunc
Func listFile($path)
$Atmp = _FileListToArray($path,"*.pdf",1,1)
For $i = 1 To UBound($Atmp) -1
_ArrayAdd($Alistefile,$Atmp[$i])
ConsoleWrite($Atmp[$i] & @CRLF)
Next
EndFunc
Func copieA($Alistefile)
For $i = 0 To UBound($Alistefile) -1
If Not FileExists($Alistefile[$i]) Then ContinueLoop
$psplit = PathSplit($Alistefile[$i])
If $psplit[4] <> ".pdf" Then ContinueLoop
If FileExists($dirCopy & $psplit[3] & $psplit[4]) Then;fichier de destination deja existant
Switch MsgBox(3,"Copie de " & $psplit[3] & $psplit[4],"Le fichier de detination existe déjà." & @CRLF & "Voulez vous le remplacer ?",15)
Case 6;oui
FileDelete($dirCopy & $psplit[3] & $psplit[4])
If @error Then
;console
MsgBox(48,"Erreur","Impossible de modifier le fichier :" & @CRLF & $dirCopy & $psplit[3] & $psplit[4])
Else
;console fichier supprimé :...
FileCopy($Alistefile[$i],$dirCopy & $psplit[3] & $psplit[4],9)
If @error Then
;console
MsgBox(48,"Erreur","Impossible de créer le fichier :" & @CRLF & $dirCopy & $psplit[3] & $psplit[4])
EndIf
EndIf
Case 7;non
;console fichier ignoré :...
ContinueLoop
Case 2;annuler
;console copie annulée
Return
Case -1;timeout
;console fichier ignoré :...
ContinueLoop
EndSwitch
Else
FileCopy($Alistefile[$i],$dirCopy & $psplit[3] & $psplit[4],8)
If @error Then
;console
MsgBox(48,"Erreur","Impossible de créer le fichier :" & @CRLF & $dirCopy & $psplit[3] & $psplit[4])
EndIf
EndIf
Next
EndFunc
Func PathSplit($sFilePath)
Local $sDrive, $sDir, $sFileName, $sExtension
Local $aArray = StringRegExp($sFilePath, "^\h*((?:\\\\\?\\)*(\\\\[^\?\/\\]+|[A-Za-z]:)?(.*[\/\\]\h*)?((?:[^\.\/\\]|(?(?=\.[^\/\\]*\.)\.))*)?([^\/\\]*))$", $STR_REGEXPARRAYMATCH)
If @error Then
ReDim $aArray[5]
$aArray[0] = $sFilePath
EndIf
$sDrive = $aArray[1]
If StringLeft($aArray[2], 1) == "/" Then
$sDir = StringRegExpReplace($aArray[2], "\h*[\/\\]+\h*", "\/")
Else
$sDir = StringRegExpReplace($aArray[2], "\h*[\/\\]+\h*", "\\")
EndIf
$sFileName = $aArray[3]
$sExtension = $aArray[4]
Return $aArray
EndFunc
Je suis actuellement en train de travailler dessus pour la compléter d'un interface permettant de choisir les fichiers parmi la liste des fichiers trouvés.
Je le partagerai dès qu'il sera fonctionnel.
Re: [..] Copie de fichiers vers une clé usb
Posté : jeu. 26 mars 2015 12:49
par TomAijerrie
jguinch a écrit :Pour exécuter une action à l'insertion d'un clé USB, il y a des exemples sur le forum (recherche le terme WM_DEVICECHANGE)
J'ai testé avant de me tourner vers cette méthode (deux listes de disques connectés) mais ça ne marchais pas chez moi.
Dommage, ça aurait pu être très utile.
Re: [..] Copie de fichiers vers une clé usb
Posté : jeu. 26 mars 2015 13:52
par jguinch
Pour moi, on arrive à détecter l'insertion et le retrait avec ce code :
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEX.au3>
#include <WindowsConstants.au3>
HotKeySet("{ESC}", "_Quit")
Global Const $DBT_DEVICEARRIVAL = 0x8000
Global Const $DBT_DEVICEREMOVECOMPLETE = 0x8004
Global Const $DBT_DEVTYP_VOLUME = 2
Global $DriveLetter, $usbPlugged = 0, $usbUnPlugged = 0
GUICreate("USBAutoCheckWaiting", 0, 0)
GUIRegisterMsg($WM_DEVICECHANGE, "MY_WM_DEVICECHANGE")
While 1
If $usbPlugged Then
ConsoleWrite("USB Device Plugged : " & $DriveLetter & @CRLF)
$usbPlugged = 0
EndIf
If $usbUnPlugged Then
ConsoleWrite("USB Device Unplugged : " & $DriveLetter & @CRLF)
$usbUnPlugged = 0
EndIf
Sleep(100)
WEnd
Func MY_WM_DEVICECHANGE($hWnd, $msg, $wParam, $lParam)
If $msg = $WM_DEVICECHANGE Then
; Create a struct from $lParam which contains a pointer to a Windows-created struct.
Local $tagDEV_BROADCAST_VOLUME = "dword dbcv_size; dword dbcv_devicetype; dword dbcv_reserved; dword dbcv_unitmask; word dbcv_flags"
Local $DEV_BROADCAST_VOLUME = DllStructCreate($tagDEV_BROADCAST_VOLUME, $lParam)
Local $DeviceType = DllStructGetData($DEV_BROADCAST_VOLUME, "dbcv_devicetype")
Local $size = DllStructGetData($DEV_BROADCAST_VOLUME, "dbcv_size")
Local $UnitMask
Switch $wParam
Case $DBT_DEVICEARRIVAL
If $DeviceType = $DBT_DEVTYP_VOLUME Then
$UnitMask = DllStructGetData($DEV_BROADCAST_VOLUME, "dbcv_unitmask")
$DriveLetter = GetDriveLetterFromUnitMask($UnitMask)
If $DriveLetter <> "error" Then $usbPlugged = 1
EndIf
Case $DBT_DEVICEREMOVECOMPLETE
If $DeviceType = $DBT_DEVTYP_VOLUME Then
$UnitMask = DllStructGetData($DEV_BROADCAST_VOLUME, "dbcv_unitmask")
$DriveLetter = GetDriveLetterFromUnitMask($UnitMask)
If $DriveLetter <> "error" Then $usbUnPlugged = 1
EndIf
EndSwitch
EndIf
EndFunc
Func GetDriveLetterFromUnitMask($UnitMask)
Local Const $Drives[26] = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
Local $Count = 1
Local $Pom = $UnitMask / 2
While $Pom <> 0
$Pom = Int($Pom / 2)
$Count += 1
WEnd
If $Count >= 1 And $Count <= 26 Then
Return $Drives[$Count - 1]
Else
Return "error"
EndIf
EndFunc
Func _Quit()
Exit
EndFUnc