Question 27

Comment copier un fichier ?

La méthode la plus simple consiste à utiliser l'instruction de Visual Basic FileCopy :

FileCopy "C:\Mes Documents\File.txt", "C:\Windows\CopyFile.txt"

Si cette méthode présente l'avantage de la simplicité d'utilisation, elle souffre aussi de quelques limitations :

  • elle ne permet pas de gérer les conflits, quand le fichier de destination est déjà présent.
  • Si le fichier de destination est déjà ouvert, l'instruction échoue

A noter également que FileCopy est une instruction et pas une fonction; En cas d'échec ou d'erreur, il convient de récupérer l'erreur en utilisant le mécanisme de "On error Goto ...".

L'utilisation de l'API CopyFile, plus complète, permet de palier à ces problèmes. L'exemple suivant présente l'utilisation de cette API :

Option Explicit

Private Declare Function CopyFileA Lib "kernel32" _
  ( _
  ByVal lpExistingFileName As String, _
  ByVal lpNewFileName As String, _
  ByVal bFailIfExists As Long _
  ) _
  As Long

Private Const MAX_PATH = 260

'---------------------------------------------------------------------------------------
' Procedure : MyFileCopy
' DateTime  : 25/08/2008 13:16
' Author    : FAQ VB
' Purpose   : Copy source to destination. The optional 'Overwrite' arguments allows
'             to control the function behaviour if the destination file already esists
'---------------------------------------------------------------------------------------
'
Function MyFileCopy(ByVal Source As String, _
                   ByVal Destination As String, _
                   Optional ByVal Overwrite As Boolean = True) As Boolean
    If Len(Destination) > MAX_PATH Or Len(Source) > MAX_PATH Then
        MyFileCopy = False
    Else
        If (Overwrite) Then
            MyFileCopy = (CopyFileA(Source, Destination, 0) <> 0)
        Else
            MyFileCopy = (CopyFileA(Source, Destination, 1) <> 0)
        End If
    End If
End Function

Private Sub Test()

    Dim ret         As Boolean

    ' Si overwrite vaut False, la fonction échoue si le fichier de destination existe déja
    ret = MyFileCopy("C:\Mainfolder\Subfolder\File.txt", "\\remotecomputer\sharedfolder\File.txt", False)
    
    ' Si overwrite vaut True, la fonction réussit, que le fichier de destination existe ou non
    ' Si il existait, il est écrasé
    
    ret = MyFileCopy("C:\Mainfolder\Subfolder\File.txt", "\\remotecomputer\sharedfolder\File.txt", True)
    
    ' Si on omet le dernier argument, la fonction se comporte comme dans le cas précédent (Overwrite)
    ret = MyFileCopy("C:\Mainfolder\Subfolder\File.txt", "\\remotecomputer\sharedfolder\File.txt")
        
End Sub

Il est aussi possible d'utiliser la librairie FSO (FileSystemObject) qui offre une gestion des fichiers aussi simple que peu efficace.

Pour aller plus loin

Voir aussi :

Date de publication : 07 juillet 2002
Dernière modification : 11 septembre 2008
Rubriques : Fichiers & dossiers
Mots-clés : fichiers, copier