Cut-It, (2)

Utilidad para trocear archivos grandes en piezas más pequeñas y después volver a unirlo

 

Revisión del 20/Sep/1997
Nueva versión: 22/Feb/2001


El fichero con el código y el ejecutable para VB6 SP4: CutIt3.zip 47.8 KB

 

Nota del 25/Oct/2005:
Pulsa en este link para ver la última versión que ahora trocea ficheros de más de 2 GB y es mucho más rápida.

 


He mejorado bastante la utilidad de trocear y unir programas.

Antes de explicarlo, deberías ver el nuevo "look" del form:

 

 

Se auto-registra la extensión cit, con nuevos valores a usar con el botón derecho del ratón

Ahora al ejecutarse se registra automáticamente la extensión cit.
Se añaden estas opciones al menú sensitivo del este tipo:

  • Unir trozos, es el valor por defecto y procesará los trozos para componer el archivo original.
  • Editar, muestra en el Bloc de Notas el archivo cit.
  • Abrir, igual que Unir trozos (valor open stándard)
  • Abrir en Cut-It, carga el form y lo muestra y se procesará sólo al pulsar en el botón Procesar

Una ventaja de que se autoregistre siempre, es que si lo cambias de ubicación y lo ejecutas, (por supuesto), se asigna en el registro el nuevo PATH del programa. No es por nada, pero esta "opción" debería estar en más de un programa... Uno de los quebraderos de cabeza que tenemos los de la "vieja" escuela, (llámese MS-DOS), al menos al principio, era de que en MS-DOS podías cambiar un programa de sitio y no pasaba nada, con Windows 95, como se te ocurra cambiarlo, las extensiones asociadas ya no funcionan.
Y con este programa, eso no ocurre.

Este es el código del procedimiento de auto-registro:

Private Sub Asociar_cIt()
    'Asociar la extensión cIt a Cut-It
    '
    Dim sProgId As String
    Dim sDef As String
    Dim hKey As Long
    Dim phkResult As Long
    Dim lRet As Long
    Dim sValue As String
    Dim sKey As String
    Dim fExt As String
    Dim sExe As String

    '
    fExt = ".cit"
    sProgId = "gsCutIt"
    sExe = LCase$(App.Path & "\" & App.EXEName & ".exe ")

    'Registrar la extensión
    sKey = fExt
    sValue = sProgId
    lRet = RegSetValue(HKEY_CLASSES_ROOT, sKey, REG_SZ, sValue, Len(sValue))
    '
    sKey = sProgId
    sValue = "Cut-It (trocear y unir archivos)"
    lRet = RegSetValue(HKEY_CLASSES_ROOT, sKey, REG_SZ, sValue, Len(sValue))

    sProgId = QueryRegBase(fExt)
    If Len(sProgId) Then
        'Nombre de la clave para esta extensión
        sDef = "Software\Classes\" & sProgId & "\shell"
        'usar HKEY_LOCAL_MACHINE, ya que HKEY_CLASSES_ROOT es una copia de: HKEY_LOCAL_MACHINE\Software\Classes
        hKey = HKEY_LOCAL_MACHINE
        'Crear la clave del registro, si ya existe, simplemente la abre.
        'Nota: Esta función permite crear varios niveles
        lRet = RegCreateKey(hKey, sDef, phkResult)
        If lRet = ERROR_SUCCESS Then
            'Si no hay error, la clave está creada y/o abierta
            '
            sKey = "Editar"
            sValue = "&Editar"
            lRet = RegSetValue(phkResult, sKey, REG_SZ, sValue, Len(sValue))
            '
            sKey = "Editar\command"
            sValue = "C:\Windows\Notepad.exe " & Chr$(34) & "%1" & Chr$(34)
            lRet = RegSetValue(phkResult, sKey, REG_SZ, sValue, Len(sValue))
            '
            'Mostrar el form
            sKey = "Abrir en CutIt"
            sValue = "Abrir en &Cut-It"
            lRet = RegSetValue(phkResult, sKey, REG_SZ, sValue, Len(sValue))
            '
            sKey = "Abrir en CutIt\command"
            sValue = sExe & Chr$(34) & "%1" & Chr$(34) & " /F"
            lRet = RegSetValue(phkResult, sKey, REG_SZ, sValue, Len(sValue))

            'Unir automáticamente
            sKey = sProgId
            sValue = "&Unir trozos"
            lRet = RegSetValue(phkResult, sKey, REG_SZ, sValue, Len(sValue))
            '
            sKey = sProgId & "\command"
            sValue = sExe & Chr$(34) & "%1" & Chr$(34)
            lRet = RegSetValue(phkResult, sKey, REG_SZ, sValue, Len(sValue))
            '
            'Abrir (open)
            sKey = "\open\command"
            sValue = sExe & Chr$(34) & "%1" & Chr$(34)
            'Si no se especifica sKey, se asigna a la clave abierta
            lRet = RegSetValue(phkResult, sKey, REG_SZ, sValue, Len(sValue))

            'Poner este prograna por defecto (asignarlo a Shell)
            sKey = ""
            sValue = sProgId
            'Si no se especifica sKey, se asigna a la clave abierta
            lRet = RegSetValue(phkResult, sKey, REG_SZ, sValue, Len(sValue))
            '
            'Cerrar la clave abierta
            lRet = RegCloseKey(phkResult)
        End If
    End If
End Sub

 

Acelerado el proceso de trocear y unir

En la versión anterior, cuando se leía o se guardaba, se procesaban bloques de 1KB, ahora este valor es configurable hasta 32 KB, con lo cual se acelera bastante tanto a la hora de trocear como a la de unir los trozos.
Si no me crees, pruebalo con un archivo grande. Antes te podías ir a tomar café y todo eso... de todas formas, no me vendría mal un cafelito ahora...

 

Nueva opción de la línea de comandos

Ahora se puede especificar en la línea de comandos el parámetro /F para que se muestre el form y no se procese automáticamente el archivo seleccionado.

 

Valores predeterminados del tamaño de cada trozo y el buffer para la transferencia

Los valores para el tamaño de cada trozo por defecto y el tamaño del buffer de transferencia se pueden dejar como valores predeterminados. Para ello debes hacer click en el chekbox correspondiente, una vez marcado como predeterminado, se quita la marca y se muestra el valor entre paréntesis.
Lo he hecho así, porque después se modifica el tamaño del trozos para ajustarse al tamaño del buffer de transferencia.

Lo explico un poco:
El buffer de transferencia es la cantidad de KB que se grabará en cada bucle de proceso, antes era 1024 bytes:

            'Leer 1024 bytes o el resto... (ahora BytesPorBucle)
            lngResto = lngSize - TotalGrabado
            If lngResto >= BytesPorBucle Then
                lngResto = BytesPorBucle
            End If
            Cadena = String$(lngResto, " ")
            GrabadoActual = GrabadoActual + lngResto
            TotalGrabado = TotalGrabado + lngResto
            Get Origen, , Cadena
            Put Destino, , Cadena

Si el tamaño del trozo es, por ejemplo 500 KB y el tamaño del buffer es de 16 KB, no se podría procesar bien el archivo ya que 500 no es exactamente divisible por 16 y provoca que se grabe o lea una cantidad errónea, dejando al fichero inservible... me ha dado un poco por "saquillo" el tema hasta que he dado con la "tecla".
Por tanto, se ajusta el tamaño del trozo a un valor "exactamente" divisible... y ya que en la pantalla se indica que el valor introducido es el tamaño "máximo" que se quiere para cada trozo, lo que hace el programa es bajar ese tamaño hasta ajustarlo a uno óptimo; el procedimiento que se encarga de esto es este:

Public Sub AjustarTrozo()
    Dim i As Integer

    'Redondear a un valor "entero" igual o menor que TotalTrozo
    If (iSize / KbPorBucle) <> Fix(iSize \ KbPorBucle) Then
        i = Fix(iSize \ KbPorBucle)
        iSize = i * KbPorBucle
    End If
    If FormVisible Then
        fCutIt.txtKbPorBucle = KbPorBucle
        fCutIt.txtSizeTrozo = iSize
    End If
End Sub

 

Algunas otras cosillas

Estas ya son un poco "estéticas" y siempre para usar cuando se muestra el form.

Al abrir un archivo para trocear, se ajusta automáticamente el tamaño del trozo, si quieres usar uno mayor, escribe el valor que quieras y pulsa intro para que se calcule el tamaño del nuevo trozo.
Igualmente al cambiar el tamaño del buffer de transferencia, pulsa intro y se ajustará el tamaño máximo del trozo.

Cuando se abre un archivo "troceado", se informa del nombre que tenía, el tamaño, la fecha, el valor del trozo mayor y el buffer que se usó para grabarlo.

 

Aquí tienes la nueva versión con los listados, echale un vistazo al listado o simplemente úsalo.
A ver si se extiende este programa y nos ayudamos a la hora de bajar archivos "enormes"

Pulsa este link para bajarte el nuevo ejecutable y los listados (CutIt2.zip 23.4 KB)
Nota: Bájate el que tengo puesto arriba.


ir al índice principal del Guille