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 psoft@latino.net.co

 

ir al índice