Copiando Archivos

�Se pueden escribir un c�digo en Basic para copiar archivos de cualquier tipo?. Pues s�, aqu� les presento un ejemplo completo y funcional. �Porqu� quisiera escribir c�digo para copiar archivos si ya existe FileCopy?. Les enumero unas buenas razones.

  • Escribir un programa de instalaci�n en Visual Basic completamente personalizado, con controles de avance byte por byte de la instalaci�n y cuestiones similares.
  • Aplicar alg�n algoritmo de compresi�n al copiar el archivo y descompresi�n al recuperarlo.
  • Aplicar alg�n algoritmo de codificaci�n (el suyo por ejemplo)
  • Incluir meta-informaci�n a sus archivos
  • Gu�a de como se puede enviar un archivo por un puerto

Como estas, deben existir m�s razones. Para implementar cualquiera de estos temas debe personalizar el c�digo, �selo como gu�a simplemente. El origen de este procedimiento fue la creacci�n de un programa de instalaci�n personalizado (esto implementa un c�digo m�s extenso dentro del procedimiento).


Comentarios

  • El archivo fuente debe estar cerrado
  • La t�cnica de copiar por grupos de bytes mejora la velocidad de proceso. El aumento de la constante INLINE no mejora significativamente el rendimiento, el sistema es el que principalmente controla el volcado de la buffer
  • El c�digo es para VB4 o superior, en general para otro Basic son pocos los cambios que se deben hacer
  • La funci�n como la presento, no incluye filtros ni control de errores eventuales
  • La funci�n FileNameFromPath (a�sla el nombre de archivo de una sarta trayectoria-archivo) es �til y la uso en otros contextos.

El c�digo se muestra a continuaci�n:

'---------------------------------------------------------------------
'Copia un archivo.
'Sintaxis
'FileCopy fuente, destino [, sobre escritura]
'Argumentos:
'SourceFile: nombre completo de un archivo a copiarse
'DestinationPath: nombre de la ruta de destino
'OverWrite: Opci�n de especificar sobre escritura.
'Por Harvey Triana, Petrosoft Co., 1996
'---------------------------------------------------------------------
Sub PetrosoftCopyFile(SourceFile As String, DestinationPath As String, Optional OverWrite As Variant)

    Const INLINE = 2 ^ 10
    
    Dim Tem    As String
    Dim i      As Integer
    Dim RCnl   As Integer
    Dim WCnl   As Integer
    Dim Bytes  As Long
    Dim Groups As Long
    Dim SBytes As Long
    
   'Este bloque verifica la sobre escritura si al archivo exise
    Tem = DestinationPath + FileNameFromPath(SourceFile)
    
    If Len(Dir(Tem)) Then
       If IsMissing(OverWrite) Then
          Kill Tem
       Else
          If OverWrite Then
             Kill Tem
          Else
             Exit Sub
          End If
       End If
    End If
       
    RCnl = FreeFile
    Open SourceFile For Binary Access Read As #RCnl
    WCnl = FreeFile
    Open Tem For Binary Access Write As #WCnl
    
   'Copia por grupos de bytes
    Bytes = LOF(RCnl)
    Groups = Int((Bytes / INLINE))
    SBytes = (Bytes - Groups * INLINE)

    If Groups > 0 Then
       For i = 1 To Groups
           Tem = Input$(INLINE, #RCnl)
           Put #WCnl, , Tem
       Next
    End If

    If SBytes > 0 Then
       Tem = Input$(SBytes, #RCnl)
       Put #WCnl, , Tem
    End If

    Close RCnl, WCnl
End Sub


Public Function FileNameFromPath(Tem As String) As String
    
    Dim x As String, i
    
    If InStr(Tem, "\") Then
       i = Len(Tem)
       Do
          x = Mid$(Tem, i, 1)
          i = i - 1
       Loop Until x = "\" Or i = 0
       FileNameFromPath = Mid$(Tem, i + 2)
    Else
       FileNameFromPath = Tem
    End If
End Function

Atentamente,
Harvey Triana [email protected]

 

ir al índice