Miércoles 6 de abril del 2011

Una herramienta que me gusta mucho es robocopy, para quien no lo sepa es una herramienta de Microsoft para crear copias de directorios o unidades completas olvidándonos de problemas de nombres largos, carácteres extraños, etc.

El problema es que no tiene entorno gráfico y los que existen son demasiado tediosas por que el uso que solemos darle es simplemente elegir un directorio de origen y uno de destino. Por eso he desarrollado una interfaz con las opciones justas. Está programada en VB.Net y podéis descargar el ejecutable como el código fuente.

Le he dado el nombre de roboCAUpy haciendo un guiño al departamento del CAU de mi trabajo ya que es muy usado para hacer las migraciones de los perfiles de usuario de un ordenador a otro y copias de seguridad.

A continuación tienes el código fuente (120 líneas) completamente comentado

Imports System
Imports System.IO
Imports System.Collections
Public Class Form1
    Dim proceso As New Process 'Crea el proceso
    Dim rutaRoboCopy As String 'Contendra la ruta a robocopy
    Private Sub EjecutarRoboCopy() 'Funcion encargada de ejecutar el robocopy con los parametros de la GUI
        'Desactiva los controles antes de iniciar la copia y muestra el textbox del log.
        ListBox1.Items.Clear()
        ListBox1.Visible = True
        ProgressBar1.Visible = True
        gbOpciones.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
        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
        'Verifica el estado por un timer ya que si no da la sensación de aplicación colgada
        Timer1.Enabled = True
    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()
            gbOpciones.Enabled = True
            btCopiar.Text = "Copiar"
            btExaminarOrigen.Enabled = True
            btExaminarDestino.Enabled = True
            tbOrigen.Enabled = True
            tbDestino.Enabled = True
            ProgressBar1.Visible = False
        End If
    End Sub
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        'Este timer es el 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
        If proceso.HasExited = False Then 'Si no ha finalizado escribe la ultima linea que devuelve el proceso en el TextBox
            ' Do While Not linea Is Nothing
            linea = proceso.StandardOutput.ReadLine
            ListBox1.Items.Add(linea)
            '    Loop
            ListBox1.SelectedIndex = ListBox1.Items.Count - 1
        Else 'Si ha finalizado escribe lo que queda y para el timer.
            Timer1.Enabled = False ' Para timer
            btCopiar.Text = "Copiar"
            'Copia lo que queda
            linea = proceso.StandardOutput.ReadLine
            Do While Not linea Is Nothing
                ListBox1.Items.Add(linea)
                linea = proceso.StandardOutput.ReadLine
            Loop
            ListBox1.SelectedIndex = ListBox1.Items.Count - 1
            'Oculta la barra de progreso
            ProgressBar1.Visible = False
            'Habilita los controles
            gbOpciones.Enabled = True
            btExaminarOrigen.Enabled = True
            btExaminarDestino.Enabled = True
            tbOrigen.Enabled = True
            tbDestino.Enabled = True
            ProgressBar1.Visible = False
        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.File.Exists(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
    End Sub
End Class

Para ejecutar correctamente roboCAUpy se recomienda tener el Windows Resource Kit Tools instalado o bien una copia de robocopy.exe en System32 o la misma carpeta del programa y .Net Framework 2.0 o superior.

Actualización (14/04/2011): Solucionado bug Windows XP (linea 25)

Descargar Robocaupy, interfaz sencilla de robocopy

  • Facebook
  • Meneame
  • BarraPunto
  • PDF

Acerca de Miguel Díaz

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

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>

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