Id. de artículo: 102671 - Última revisión: martes, 06 de mayo de 2003 - Versión: 2.0

ACC: Ejemplo función CopyFile() para copiar archivos del disco

En esta página

Expandir todo | Contraer todo

Resumen

Avanzado: Requiere codificación experto, interoperabilidad, conocimientos y multiusuario.

Access Basic carece de un comando, como por ejemplo, el comando COPY de MS-DOS, para copiar un archivo de disco.

En este artículo incluye dos variaciones de una función de Access Basic denominada CopyFile(), dos de los cuales permiten copiar archivos de disco.

En este artículo se asume que está familiarizado con Access Basic y con la creación de aplicaciones de Microsoft Access mediante las herramientas de programación suministradas con Microsoft Access. Para obtener más información acerca de Access Basic, consulte el manual "Introduction to Programming" de Microsoft Access versión 1.x o la "creación de aplicaciones"manual, capítulo 3,"Introducción A Access Basic" en la versión 2.0.

Nota: Microsoft Access para Windows 95 puede copiar archivos con la nueva instrucción FileCopy. Para obtener más información acerca de FileCopy, busque "Declaración de FileCopy" utilizando el Microsoft Access para el índice de Ayuda de Windows 95.

Más información

Se proporcionan dos variaciones de la función de Access Basic CopyFile() debajo. La primera versión utiliza sólo el código de Microsoft Access Basic; la segunda aprovecha algunas llamadas de función a la interfaz de programación de aplicaciones (API) de Windows para optimizar el rendimiento, especialmente con archivos mayores.

Nota: Puede tener algunas funciones de API de Windows definidas en una biblioteca Microsoft Access existente; por lo tanto, las declaraciones pueden ser duplicados. Si recibe el mensaje de error de nombre de procedimiento duplicados al compilar o ejecutar el código, quitar o comentario la instrucción de declaraciones apropiado desde el código.

Método 1: CopyFile() función mediante código de acceso estándar básico

   '**************************************************************
   ' DECLARATION SECTION
   '**************************************************************
   Option Explicit

   '**************************************************************
   ' FUNCTION: CopyFile()
   ' PURPOSE:
   '   Facilitates copying a disk file.
   ' ARGUMENTS:
   '   Source      - The path\filename of the file to copy from.
   '   Destination - The path\filename of the file to copy to.
   ' RETURN:
   '   The length of the file copied.
   '**************************************************************
   Function CopyFile (ByVal Source$, ByVal Destination$) As Long
       Dim Index1 As Integer, NumBlocks As Integer
       Dim FileLength As Long, LeftOver As Long, AmountCopied As Long
       Dim SourceFile As Integer, DestFile As Integer
       Dim FileData As String
       Dim RetVal As Variant
       Const BlockSize = 32768

       On Error GoTo Err_CopyFile

       ' Remove the destination file.
       DestFile = FreeFile
       Open Destination For Output As DestFile
       Close DestFile

       ' Open the source file to read from.
       SourceFile = FreeFile
       Open Source For Binary Access Read As FreeFile

       ' Open the destination file to write to.
       DestFile = FreeFile
       Open Destination For Binary As DestFile

       ' Get the length of the source file.
       FileLength = LOF(SourceFile)

       ' Calculate the number of blocks in the file and left over.
       NumBlocks = FileLength \ BlockSize
       LeftOver = FileLength Mod BlockSize

       ' Create a buffer for the leftover amount.
       FileData = String$(LeftOver, 32)

       ' Read and write the leftover amount.
       Get SourceFile, , FileData
       Put DestFile, , FileData

       ' Create a buffer for a block to be read.
       FileData = String$(BlockSize, 32)

       ' Read and write the remaining blocks of data.
       For Index1 = 1 To NumBlocks
          ' Read and write one block of data.
          Get SourceFile, , FileData
          Put DestFile, , FileData
       Next Index1

       Close SourceFile, DestFile
       CopyFile = AmountCopied

   Bye_CopyFile:
       Exit Function

   Err_CopyFile:
       CopyFile = -1 * Err
       Resume Bye_CopyFile

   End Function
				

Método 2: De las llamadas a función de función de CopyFile() mediante API de Windows

   '****************************************************************
   ' DECLARATION SECTION
   '****************************************************************
   Declare Function fWrite Lib "kernel" Alias "_lwrite" (ByVal hFile%, _
                       ByVal lpBuff&, ByVal nBuff%) As Long
   Declare Function fRead Lib "kernel" Alias "_lread" (ByVal hFile%, _
                       ByVal lpBuff&, ByVal nBuff%) As Long
   Declare Function GlobalAlloc Lib "Kernel" (ByVal wFlags%, _
                       ByVal dwBytes&) As Integer
   Declare Function GLobalFree Lib "kernel" (ByVal hMem%) As Long
   Declare Function GlobalLock Lib "Kernel" (ByVal hMem%) As Long
   Declare Function GLobalUnlock Lib "kernel" (ByVal hMem%) As Long

   '****************************************************************
   ' FUNCTION: CopyFile()
   ' PURPOSE:
   '   Facilitates copying a disk file.
   ' ARGUMENTS:
   '   Source      - The path\filename of the file to copy from.
   '   Destination - The path\filename of the file to copy to.
   ' RETURN:
   '   The length of the file copied, if successful.
   '***********************************************************
   Function CopyFile (ByVal Source$, ByVal Destination$) As Long
       Dim FileLength As Long, AmountCopied As Long
       Dim RetVal As Variant, lpBuff As Long
       Dim DestFile As Integer, SourceFile As Integer
       Dim DestDOS As Integer, SourceDOS As Integer
       Dim ApiErr As Integer, AmtRead As Integer
       Dim hMem As Integer
       Const nBuff = 32767
       Const wFlags = &H20

       On Error GoTo Err_CopyFile

       ' Get the size of the file.
       SourceFile = FreeFile
       Open Source For Binary Access Read As SourceFile
       FileLength = LOF(SourceFile)
       Close SourceFile

       ' Allocate and lock memory to buffer file contents.
       hMem = GlobalAlloc(wFlags, nBuff)
       lpBuff = GlobalLock(hMem)

       ' Open the source file to read from.
       SourceFile = FreeFile
       Open Source For Input As SourceFile Len = 1

       ' Open the destination file to write to.
       DestFile = FreeFile
       Open Destination For Output As DestFile Len = 1

       ' Get the operating system file handles.
       DestDOS = FileAttr(DestFile, 2)
       SourceDOS = FileAttr(SourceFile, 2)

       Do
          ' Read and write nBuff worth of data.
          AmtRead = fRead(SourceDOS, ByVal lpBuff, nBuff)
          ApiErr = fWrite(DestDOS, ByVal lpBuff, AmtRead)
          AmountCopied = AmountCopied + AmtRead
       Loop Until AmtRead = 0

       Close SourceFile, DestFile

       ' Unlock and free the file buffer memory.
       lpBuff = GLobalUnlock(hMem)
       hMem = GLobalFree(hMem)

       CopyFile = AmountCopied

   Bye_CopyFile:
       Exit Function

   Err_CopyFile:
       CopyFile = -1 * Err
       Resume Bye_CopyFile
   End Function
				

La función CopyFile() puede probarse desde la ventana Inmediato, como sigue:
  1. Cree o abra un módulo en Microsoft Access.
  2. En el menú Ver, elija ventana Inmediato.
  3. Escriba la línea siguiente y, a continuación, presione ENTRAR:

    ? CopyFile ("C:\WINDOWS\CHESS.BMP", "C:\CHESS.BMP")

    Se puede invocar la función CopyFile() desde una función básica de Access
          Dim RetVal As Long
          RetVal = CopyFile("C:\WINDOWS\CHESS.BMP", "C:\CHESS.BMP")
    						

    o mediante la acción de macro EjecutarCódigo:
          RunCode
          Function Name: CopyFile("C:\WINDOWS\CHESS.BMP", "C:\CHESS.BMP")
    						


La información de este artículo se refiere a:
  • Microsoft Access 1.0 Standard Edition
  • Microsoft Access 1.1 Standard Edition
  • Microsoft Access 2.0 Standard Edition
Palabras clave: 
kbmt kbinfo kbprogramming KB102671 KbMtes
Traducción automáticaTraducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 102671  (http://support.microsoft.com/kb/102671/en-us/ )
Retired KB ArticleRenuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.
 

Seleccione idioma