IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

FTP - VBA - Renommer plusieurs fichiers


Sujet :

VBA Access

  1. #1
    Membre habitué Avatar de Maxi-môme
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2006
    Messages : 144
    Points : 144
    Points
    144
    Par défaut FTP - VBA - Renommer plusieurs fichiers
    Salut à tous,

    Je recupere un fichier de type "Rnomdufichier.csv" (le nom de fichier commence toujours par la lettre R) sur un ftp.
    Une fois que j'ai recupere ce fichier et que je l'ai integre dans ma base, je souhaiterai le renommer sur le ftp en "Rnomdufichier.transfere".

    Je voudrai utiliser un truc du genre

    rename R*.csv R*.transfere

    Je vois pas trop comment je peux faire, avez vous une idée ?

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonsoir,

    en supposant que tu récupères ton fichier avec ce code source, tu ajoutes cette déclaration aux autres
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Declare Function FtpRenameFile Lib "wininet.dll" Alias "FtpRenameFileA" _
                    (ByVal hConnect As Long, ByVal lpszExisting As String, _
                     ByVal lpszNew As String) As Boolean

    Exemple de la rubrique sources adapté :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Dim HwndConnect As Long 
    Dim HwndOpen As Long 
    'Ouvre internet 
    HwndOpen = InternetOpen("SiteWeb", 0, vbNullString, vbNullString, 0) 
    'Connection au site ftp 
    HwndConnect = InternetConnect(HwndOpen, "<ftp>", <port>, _
      "<username>", "<password>", 1, 0, 0) 
    'positionnement du curseur dans le répertoire 
    FtpSetCurrentDirectory HwndConnect, "page_web/documents" 
     
     'Téléchargement de test.txt
    FtpGetFile HwndConnect, "test.txt", "C:\WINDOWS\Bureau\test.txt", _
      False, 0, &H0, 0
     
    ' renomme fichier Ftp
    FtpRenameFile HwndConnect, "test.txt", "test.transfere"
     
    InternetCloseHandle HwndConnect 'Ferme la connection 
    InternetCloseHandle HwndOpen 'Ferme internet
    A+

  3. #3
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Sans aller autant loin et partant du fait que tu récupères déjà ton fichier "manuellement", tu peux alors lui appliquer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Name "C:\MonFichierOriginal.csv" As "C:\MonFichierFinal.csv"
    Mais le code ci-dessus t'évites toute la partie de récupération puisqu'elle le fait elle-même.
    A+

  4. #4
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Just pour le fun... tu peux te créer une petite fonction toute simple et qui rappelera MS-Dos aux "anciens"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function Rename(strOrigine As String, strDestination As String)
        Name strOrigine As strDestination
    End Function

  5. #5
    Membre habitué Avatar de Maxi-môme
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2006
    Messages : 144
    Points : 144
    Points
    144
    Par défaut
    Merci pour ta réponse LedZeppII, j'ai essaye d'utiliser cette fonction : ça marche bien si tu mets un nom de fichier en "dur".
    Mais je voudrai pouvoir faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FtpRenameFile HwndConnect, "R*.csv", "R*.transfere"
    Et le FTP ne comprend pas cette instruction, pas d'erreur mais il ne se passe rien.

    Quant à la réponse de bernardmichel (merci aussi), j'ai essaye de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Name "R*.csv" as "R*.transfere"
    Et la pour le coup il me met une erreur :

    Bad file name or number (Error 52)

    C'est "*" qu'il n'aime pas je pense

  6. #6
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonjour,
    Citation Envoyé par Maxi-môme Voir le message
    j'ai essaye d'utiliser cette fonction : ça marche bien si tu mets un nom de fichier en "dur".
    Mais je voudrai pouvoir faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FtpRenameFile HwndConnect, "R*.csv", "R*.transfere"
    Et le FTP ne comprend pas cette instruction, pas d'erreur mais il ne se passe rien.
    C'est normal, ce n'est pas fait pour.
    C'est pour cela que je suggérai de renommer les fichiers juste après le transfert.

    Apparement tu dois procéder autrement.
    Voila ce que j'ai pû faire (tout copier dans un nouveau module de code, et ajouter la référence 'Microsoft VBScript Regular Expression 5.5' au projet)
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
     
    #Const DEBUG_ON = True
     
    ' ---------------------------------------------------------
    ' ------------== Déclaration des API ==--------------------
    ' ---------------------------------------------------------
     
    ' 1. Constantes générales
    '     ===================
    Const MAX_PATH = 260
     
    ' 2. Structures
    '    ==========
     
    ' DATE/TIME Structure
    Type FILETIME
        dwLowDateTime As Long
        dwHighDateTime As Long
    End Type
     
    ' FINDFILE Structure
    Type WIN32_FIND_DATA
        dwFileAttributes As Long
        ftCreationTime As FILETIME
        ftLastAccessTime As FILETIME
        ftLastWriteTime As FILETIME
        nFileSizeHigh As Long
        nFileSizeLow As Long
        dwReserved0 As Long
        dwReserved1 As Long
        cFileName As String * MAX_PATH
        cAlternateFileName As String * 13
    End Type
     
    ' 3. Déclaration Constantes et Functions de l'API Windows Internet/ftp
    '    =================================================================
    Const FTP_TRANSFER_TYPE_ASCII = &H1           ' 0x00000001
    Const FTP_TRANSFER_TYPE_BINARY = &H2          ' 0x00000002
     
    Const INTERNET_DEFAULT_FTP_PORT = 21               ' default for FTP servers
    Const INTERNET_DEFAULT_GOPHER_PORT = 70            '    "     "  gopher "
    Const INTERNET_DEFAULT_HTTP_PORT = 80              '    "     "  HTTP   "
    Const INTERNET_DEFAULT_HTTPS_PORT = 443            '    "     "  HTTPS  "
    Const INTERNET_DEFAULT_SOCKS_PORT = 1080           ' default for SOCKS firewall servers.
     
    ' access types for InternetOpen()
    Const INTERNET_OPEN_TYPE_PRECONFIG = 0                     ' use registry configuration
    Const INTERNET_OPEN_TYPE_DIRECT = 1                        ' direct to net
    Const INTERNET_OPEN_TYPE_PROXY = 3                         ' via named proxy
    Const INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY = 4   ' prevent using java/script/INS
     
    ' service types for InternetConnect()
    Const INTERNET_SERVICE_URL = 0
    Const INTERNET_SERVICE_FTP = 1
    Const INTERNET_SERVICE_GOPHER = 2
    Const INTERNET_SERVICE_HTTP = 3
     
    Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _
                    (ByVal sAgent As String, ByVal lAccessType As Long, _
                     ByVal sProxyName As String, ByVal sProxyBypass As String, _
                     ByVal lFlags As Long) As Long
     
    Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" _
                    (ByVal hInternetSession As Long, ByVal sServerName As String, _
                     ByVal nServerPort As Integer, ByVal sUserName As String, _
                     ByVal sPassword As String, ByVal lService As Long, _
                     ByVal lFlags As Long, ByVal lContext As Long) As Long
     
    Private Declare Function InternetCloseHandle Lib "wininet.dll" _
                    (ByVal hInet As Long) As Integer
     
    Private Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias "FtpSetCurrentDirectoryA" _
                    (ByVal hFtpSession As Long, ByVal lpszDirectory As String) As Boolean
     
    Private Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" _
                    (ByVal hConnect As Long, ByVal lpszLocalFile As String, _
                     ByVal lpszNewRemoteFile As String, ByVal dwFlags As Long, _
                     ByVal dwContext As Long) As Boolean
     
    Private Declare Function FtpFindFirstFile Lib "wininet.dll" Alias "FtpFindFirstFileA" _
                    (ByVal hConnect As Long, ByVal lpszSearchFile As String, _
                     ByRef lpvFindData As WIN32_FIND_DATA, ByVal dwFlags As Long, _
                     ByVal dwContext As Long) As Long
     
    ' utilisé après FtpFindFirstFile pour continuer énumération
    Private Declare Function InternetFindNextFile Lib "wininet.dll" Alias "InternetFindNextFileA" _
                    (ByVal hFind As Long, ByRef lpvFindData As WIN32_FIND_DATA) As Boolean
     
    Private Declare Function FtpRenameFile Lib "wininet.dll" Alias "FtpRenameFileA" _
                    (ByVal hConnect As Long, ByVal lpszExisting As String, _
                     ByVal lpszNew As String) As Boolean
     
    ' ------------------------------------------------------
    ' Renommer avec wildcards
    '
    ' Entrées
    ' Nom             : Nom à renommer
    ' MasqueEntree    : Masque entrée  ex: toto*.txt
    ' MasqueSortie    : Masque sortie  ex: titi*.txt
    '
    ' Sortie          : String
    ' Nouveau Nom, ou ancien Nom s'il ne respecte pas le masque d'entrée
    ' ------------------------------------------------------
    Function NvNom(Nom As String, _
                   ByVal MasqueEntree As String, _
                   ByVal MasqueSortie As String) As String
    Dim oRegEx As RegExp ' Référence : Microsoft VBScript Regular Expression 5.5
    Dim strRplc As String, i As Integer, c As String, itm As Integer
     
    MasqueEntree = Replace(MasqueEntree, "\", "\\")
    MasqueEntree = Replace(MasqueEntree, ".", "\.")
    MasqueEntree = Replace(MasqueEntree, "*", "(.*)")
    MasqueEntree = Replace(MasqueEntree, "?", "(.)")
     
    ' String for .Replace(...,...)
    itm = 1: strRplc = ""
    For i = 1 To Len(MasqueSortie)
        c = Mid(MasqueSortie, i, 1)
        Select Case c
           Case "*", "?"
               strRplc = strRplc & Format(itm, "\$#")
               itm = itm + 1
           Case Else
               strRplc = strRplc & c
        End Select
    Next
     
    Set oRegEx = New RegExp
    oRegEx.IgnoreCase = True
    oRegEx.Pattern = MasqueEntree
     
    NvNom = oRegEx.Replace(Nom, strRplc)
    End Function
     
    ' ------------------------------------------------------
    ' Renommer des fichiers sur serveur ftp avec wildcards
    '
    ' Entrées
    ' strFTPsvr       : nom du serveur ftp
    ' UID             : nom utilisateur ftp
    ' Pwd             : mot de passe
    ' DossierFTP      : Dossier sur le serveur ftp
    ' FichierFTP      : fichier(s) recherché(s)
    '                   nom de fichier ou masque (toto*.txt)
    ' RenommerEn      : nouveau nom de fichier ou masque (titi*.txt)
    '                   Le nombre de * et ? ne doit pas être supérieur à
    '                   celui des fichiers recherchés
    '
    ' Sortie          : aucune
    ' ------------------------------------------------------
    Sub RenameFtpFiles(strFTPsvr As String, UID As String, Pwd As String, _
                       DossierFTP As String, FichierFTP As String, _
                       RenommerEn As String)
    ' Internet Handles for Internet Session, Internet Connection, Internet File
    Dim hInternetSess As Long, hIConnect As Long, hIFile As Long
    ' Internet handle for FtpFindFirstFile, and Find File Structure
    Dim hIFF As Long, ffF As WIN32_FIND_DATA
    '
    Dim RetVal As Long, fileName As String, p As Long
    Dim fileNameNew As String
     
    'Ouvre session internet
    hInternetSess = InternetOpen("MonAppli", INTERNET_OPEN_TYPE_PRECONFIG, _
                                 vbNullString, vbNullString, 0)
     
    'Connection au serveur ftp
    hIConnect = InternetConnect(hInternetSess, strFTPsvr, _
                                INTERNET_DEFAULT_FTP_PORT, UID, Pwd, _
                                INTERNET_SERVICE_FTP, 0, 0)
     
    ' Définit le répertoire distant
    RetVal = FtpSetCurrentDirectory(hIConnect, DossierFTP)
     
    ' Enumération fichier(s)
    ffF.cFileName = String(MAX_PATH, vbNullChar)
    hIFF = FtpFindFirstFile(hIConnect, FichierFTP & vbNullChar, ffF, 0, 0)
    If hIFF <> 0 Then
       Do
          p = InStr(1, ffF.cFileName, vbNullChar)
          fileName = Left(ffF.cFileName, p - 1)
          fileNameNew = NvNom(fileName, FichierFTP, RenommerEn)
     
          #If DEBUG_ON = False Then
              ' renomme fichier Ftp
              FtpRenameFile hIConnect, fileName, fileNameNew
          #Else
              Debug.Print fileName, fileNameNew
          #End If
     
          If InternetFindNextFile(hIFF, ffF) = False Then Exit Do
       Loop
       InternetCloseHandle (hIFF)
    End If
     
    InternetCloseHandle hIConnect          'Ferme la connection
    InternetCloseHandle hInternetSess      'Ferme la session internet
     
    End Sub

    Exemple :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub TestRenameFtpFiles()
     
    RenameFtpFiles "em2.pifou.com", "user", "xxxxxx", _
                   "/home/bdcuser/MM", "*CL????.txt", "*_CL_????.txt"
    End Sub
    Le code fait une simulation avec Debug.Print
    Pour le faire en vrai, remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #Const DEBUG_ON = False
    A+

  7. #7
    Membre habitué Avatar de Maxi-môme
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2006
    Messages : 144
    Points : 144
    Points
    144
    Par défaut
    Je n'ai qu'une chose a dire : MERCI !

    Ton code marche super bien, merci d'avoir pris le temps de faire tout ça, c'est super

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/10/2007, 14h02
  2. renommer plusieurs fichiers
    Par Aramas dans le forum VB.NET
    Réponses: 6
    Dernier message: 20/07/2007, 13h01
  3. Renommer plusieurs fichiers
    Par DIE dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 03/02/2007, 16h40
  4. [VBA] Ouvrir plusieurs fichiers textes depuis Excel
    Par Stephane_123 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 11/12/2006, 18h45
  5. (MS DOS) Renommer plusieurs fichiers
    Par Furius dans le forum Windows
    Réponses: 12
    Dernier message: 23/11/2005, 17h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo