El blog de Miguel Díaz
Siguiente

RoboCAUpy

Copia eficiente de archivos, toda la potencia de robocopy con una interfaz sencilla y fácil de usar. Herramienta perfecta para migraciones de equipos y copia masiva de ficheros.Saber mas

Screenshot RoboCAUpy

mRemoto

Administra remotamente equipos, controlalos gráficamente o través de la línea de comandos, envía y recibe archivos, habla con el usuario y mucho mas sin ningún tipo de configuración previa.Saber mas

Screenshot mRemoto
screenshot mRemoto

DNSPropagationChecker

Controla la propagación DNS de cualquier dominio. Con un solo clic conocerás al instante si se ha propagado en los diferentes servidores DNS existentes.Saber mas

Acortador de nombres

Detecta ficheros con nombres largos, acortalos de forma masiva y reduce el tamaño de la ruta a la cantidad de carácteres que quieras.
Saber mas

screenshot Acortador Nombres
Anterior
Lunes 19 de septiembre del 2011

He desarrollado una nueva versión de RoboCAUpy.

Para quien no lo conzoca RoboCAUpy es una interfaz sencilla de robocopy, programa que nos permite realizar copias de directorios completos (tanto locales como en red) evitando aquellos problemas que pudieran surgir por cosas como nombres largos, carácteres extraños, archivos en uso o microcortes de red.

Esta utilidad es muy común para realizar copias de seguridad, migraciones de equipos, o copias de gran cantidad de ficheros, por su fiabilidad y rapidez.

La nueva versión ha añadido la opción para mantener los permisos originales de los ficheros o volver a escribirlos, ahora se puede ver el progreso individual de cada archivo al lado de su nombre y además lanza por un hilo independiente el proceso de copia de archivos de forma que la interfaz siga respondiendo aunque robocopy se encuentre pausado.

Puedes ver los cambios de código fuente (147 líneas) a continuación:

Form1.vb

 Imports System
Imports System.IO
Imports System.Collections
Imports System.Threading
Public Class Form1
    Dim proceso As New Process 'Crea el proceso
    Dim rutaRoboCopy As String 'Contendra la ruta a robocopy
    Dim hilo As Thread 'Hilo encargado de comprobar el estado de robocopy
    Private Sub EjecutarRoboCopy() 'Funcion encargada de ejecutar el robocopy
        'Desactiva los controles antes de iniciar la copia y muestra el textbox del log.
        ListBox1.Items.Clear()
        ListBox1.Visible = True
        ProgressBar1.Visible = True

Continuación de Form1.vb

        gbOpcionesError.Enabled = False
        gbOpcionesPermisos.Enabled = False
        btCopiar.Text = "Parar"
        btExaminarOrigen.Enabled = False
        btExaminarDestino.Enabled = False
        tbOrigen.Enabled = False
        tbDestino.Enabled = False
        Me.Size = New System.Drawing.Size(Me.Size.Width, Me.MaximumSize.Height)
        'Definicion del proceso robocopy
        proceso.StartInfo.FileName = rutaRoboCopy
        proceso.StartInfo.Arguments = """" & tbOrigen.Text.TrimEnd("\") & """ """ & tbDestino.Text.TrimEnd("\") & """ /E /R:" & nUDReintentar.Value & " /W:" & nUDSegundos.Value 'Parametros
        If rbNuevos.Checked = False Then
            proceso.StartInfo.Arguments &= " /SEC"
        End If
        proceso.StartInfo.RedirectStandardOutput = True 'Redirige la salida
        proceso.StartInfo.UseShellExecute = False 'No sale a ms-dos.
        proceso.StartInfo.CreateNoWindow = True 'No crea nueva ventana.
        proceso.Start() 'Lanza el proceso
        Try
            If hilo.IsAlive = True Then
                hilo.Abort()
            End If
        Catch ex As Exception
        End Try
        'Verifica el estado a través de un hilo
        hilo = New Thread(AddressOf comprobar_robocopy)
        hilo.Start()
        'Timer1.Enabled = True
    End Sub
    Sub comprobar_robocopy()
        'Encargado de ir mostrando en el ListBox la salida del proceso robocopy.exe, se hace mediante un timer en lugar de a tiempo real para no relentizar la aplicacion
        Dim linea As String = "algo"
        ListBox1.TopIndex = ListBox1.Items.Count
        Dim sr As IO.StreamReader = proceso.StandardOutput
        Dim sb As New System.Text.StringBuilder("")
        Dim sinput As String
        Do Until sinput = "-1"
            Dim bytes() As Byte = {sinput}
            linea = System.Text.Encoding.UTF8.GetString(bytes) & sr.ReadLine
            If linea.Contains("%") = True Then
                If linea.Substring(0, InStr(linea, "%") - 1) > 0 Then
                    Dim antiguoitem As String = ListBox1.Items(ListBox1.Items.Count - 2)
                    antiguoitem = antiguoitem.Remove(0, InStr(antiguoitem, "%"))
                    If InStr(ListBox1.Items(ListBox1.Items.Count - 1), "%") < 1 Then
                        ListBox1.Items(ListBox1.Items.Count - 1) = linea.Substring(0, InStr(linea, "%")) & ListBox1.Items(ListBox1.Items.Count - 1)
                    Else
                        ListBox1.Items(ListBox1.Items.Count - 1) = linea.Substring(0, InStr(linea, "%")) & antiguoitem
                    End If
                Else
                    ListBox1.Items.Add(linea)
                End If
            Else
                ListBox1.Items.Add(linea)
            End If
            ListBox1.SelectedIndex = ListBox1.Items.Count - 1
            sinput = sr.Read()
        Loop
        'Oculta la barra de progreso
        restablecer_controles()
    End Sub
    Delegate Sub restablecer_controlesCallBack()
    Private Sub restablecer_controles()
        ' InvokeRequired required compares the thread ID of the
        ' calling thread to the thread ID of the creating thread.
        ' If these threads are different, it returns true.
        ProgressBar1.Visible = False
        gbOpcionesError.Enabled = True
        btExaminarOrigen.Enabled = True
        btExaminarDestino.Enabled = True
        tbOrigen.Enabled = True
        tbDestino.Enabled = True
        ProgressBar1.Visible = False
        gbOpcionesPermisos.Enabled = True
        btCopiar.Text = "Copiar"
    End Sub
    Private Sub btCopiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btCopiar.Click
        If btCopiar.Text = "Copiar" Then
            EjecutarRoboCopy() 'Ejecuta el robocopy
        Else 'Si en el boton no ponia Copiar quiere decir que ya se estaba ejecutando el robocopy por tanto para robocopy y reactiva los controles.
            proceso.Kill()
            restablecer_controles()
        End If
    End Sub
    Private Sub btExaminarOrigen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btExaminarOrigen.Click
        If oFDOrigen.ShowDialog = Windows.Forms.DialogResult.OK Then
            tbOrigen.Text = IO.Path.GetDirectoryName(oFDOrigen.FileName) 'Ruta de origen
        End If
    End Sub
    Private Sub btExaminarDestino_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btExaminarDestino.Click
        If oFDDestino.ShowDialog = Windows.Forms.DialogResult.OK Then
            tbDestino.Text = IO.Path.GetDirectoryName(oFDDestino.FileName) 'Ruta de destino
        End If
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Comprueba que exista el fichero system32/robocopy.exe, program files\Windows Resource Kits\Tools\robocopy.exe o ./robocopy.exe y si no finaliza
        If IO.File.Exists(Environment.SystemDirectory.ToString & "\robocopy.exe") = True Then
            rutaRoboCopy = Environment.SystemDirectory.ToString & "\robocopy.exe"
        ElseIf IO.File.Exists(System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) & "\Windows Resource Kits\Tools\robocopy.exe") = True Then
            rutaRoboCopy = System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) & "\Windows Resource Kits\Tools\robocopy.exe"
        ElseIf IO.File.Exists(IO.Path.GetDirectoryName(Application.ExecutablePath) & "\robocopy.exe") = True Then
            rutaRoboCopy = IO.Path.GetDirectoryName(Application.ExecutablePath) & "\robocopy.exe"
        Else
            MsgBox("No se ha encontrado robocopy.exe, asegurese de tenerlo instalado o una copia en el directorio local.")
            End
        End If
        CheckForIllegalCrossThreadCalls = False 'Realizar cambis en formulario desde otro hilo
    End Sub
End Class

Acerca de Miguel Díaz

Informático, enamorado de la programación, diseño Web y el deporte.
Categorías: Programación, Proyectos, Robocaupy, Servidores, Utilidades, Windows. Etiquetas: , , , , , , , .

Un comentario en Nueva versión de RoboCAUpy – Interfaz de robocopy

  1.  Juan dice:

    Gracias por el utilitario, es sencillo y bueno. Una consulta hace comparación de archivos antiguos y nuevos o copia todo nuevamente.

    Saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Blog de Miguel Díaz
Diseño Web por Miguel Díaz.