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, , CadenaSi 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
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.