Traspasar archivos con Perséfone

Perséfone es una aplicación de línea de comandos que copia un archivo de una ubicación origen a otra destino. Los parámetros se configuran mediante un archivo xml y registra el estado de la copia en un log además de enviarlo por correo.


Es necesario que el archivo de configuración resida en la ubicación de la aplicación y debe tener esta estructura:


<?xml version="1.0" encoding="UTF-8"?>
<configuraciones>
<!--Las rutas deben finalizar con contrabarra-->
<rutaorigen>\\Servidor_Origen\Recurso\</rutaorigen>
<nombrearchivoorigen>Archivo_Origen.jmb</nombrearchivoorigen>
<rutadestino>\\Servidor_Destino\Repositorio\</rutadestino>
<nombrearchivodestino>Archivo_Destino.jmb</nombrearchivodestino>
<!--Para introducir e-mail separado con coma y espacio-->
<destinatarioscorreo>elfosodelsarlacc@jmb.es</destinatarioscorreo>
<!--Escritura de Log, valores Y | N-->
<escrituralog>Y</escrituralog>
<rutalog>C:\TMP\Log\</rutalog>
</configuraciones>


Mediante Visual Studio creamos una aplicaion de línea de comandos e introducimos el siguiente código:

Imports System.Xml
Imports System.IO
Imports Microsoft.VisualBasic.FileIO

Module Persefone
    ' Definición de valores globales
    Public RutaOrigen As String
    Public RutaDestino As String
    Public NombreArchivoOrigen As String
    Public NombreArchivoDestino As String
    Public Destinatarios As String
    Public EscrituraLog As String
    Public RutaLog As String

    Public Sub LecturaConfiguracion()
        Dim XmlDoc As System.Xml.XmlDocument
        Dim NodeList As XmlNodeList
        Dim Node As XmlNode

        'El archivo de configuración deberá ubicarse en la ruta de la aplicación
        If FileSystem.FileExists(System.AppDomain.CurrentDomain.BaseDirectory & "Config_Persefone.xml") Then

            XmlDoc = New XmlDocument()
            XmlDoc.Load(System.AppDomain.CurrentDomain.BaseDirectory & "Config_Persefone.xml")
            ' Ruta origen
            NodeList = XmlDoc.SelectNodes("configuraciones/RutaOrigen")
            For Each Node In NodeList
                RutaOrigen = (Node.InnerXml)
            Next
            ' Ruta destino
            NodeList = XmlDoc.SelectNodes("configuraciones/RutaDestino")
            For Each Node In NodeList
                RutaDestino = (Node.InnerXml)
            Next
            ' Nombre del archivo origen
            NodeList = XmlDoc.SelectNodes("configuraciones/NombreArchivoOrigen")
            For Each Node In NodeList
                NombreArchivoOrigen = (Node.InnerXml)
            Next
            ' Nombre del archivo destino
            NodeList = XmlDoc.SelectNodes("configuraciones/NombreArchivoDestino")
            For Each Node In NodeList
                NombreArchivoDestino = (Node.InnerXml)
            Next
            ' Destinatarios de correo para las notificaciones
            NodeList = XmlDoc.SelectNodes("configuraciones/DestinatariosCorreo")
            For Each Node In NodeList
                Destinatarios = (Node.InnerXml)
            Next
            ' Escritura de Log
            NodeList = XmlDoc.SelectNodes("configuraciones/EscrituraLog")
            For Each Node In NodeList
                EscrituraLog = (Node.InnerXml)
            Next
            ' Ruta Log de la Aplicación
            NodeList = XmlDoc.SelectNodes("configuraciones/RutaLog")
            For Each Node In NodeList
                RutaLog = (Node.InnerXml)
            Next
        Else
            EscribeLog(Now.ToString & " , Er , No existe el archivo de configuración en la ruta " & (System.AppDomain.CurrentDomain.BaseDirectory & "Config_Persefone.xml"))
        End If
    End Sub

    Private Sub MoverFicheros()
        Dim Archivo As New FileInfo(FileSystem.GetFileInfo(RutaOrigen & NombreArchivoOrigen).ToString)
        Try
            If FileSystem.FileExists(RutaOrigen & NombreArchivoOrigen) Then
                FileSystem.CopyFile(RutaOrigen & NombreArchivoOrigen, RutaDestino & NombreArchivoDestino, True)

                EscribeLog(Now.ToString & " , Ok , Se ha traspasado correctamente el fichero " & RutaOrigen & NombreArchivoOrigen & " a la carpeta destino " & RutaDestino & NombreArchivoDestino & vbCrLf & _
                            "                           La fecha de creación del archivo en origen ha sido: " & Archivo.CreationTime & " con un tamaño de: " & ((Archivo.Length / 1024) / 1024).ToString & " Mb")

                EnvioCorreo(Now.ToString & " , Ok , Se ha traspasado correctamente el fichero " & RutaOrigen & NombreArchivoOrigen & " a la carpeta destino " & RutaDestino & NombreArchivoDestino & vbCrLf & _
            "                           La fecha de creación del archivo en origen ha sido: " & Archivo.CreationTime & " con un tamaño de: " & ((Archivo.Length / 1024) / 1024).ToString & " Mb")


            Else
                EscribeLog(Now.ToString & " , Er , No se ha encontrado el archivo " & RutaOrigen & NombreArchivoOrigen)
                EnvioCorreo(Now.ToString & " , Er , No se ha encontrado el archivo " & RutaOrigen & NombreArchivoOrigen)
            End If

        Catch ex As Exception
            EscribeLog(Now.ToString & " , Er , Ha ocurrido un error en el movimiento de archivos. " & ex.Message)
            EnvioCorreo(Now.ToString & " , Er , Ha ocurrido un error en el movimiento de archivos. " & ex.Message)
        End Try
    End Sub

    Public Sub EnvioCorreo(ByVal MensajeCorreo As String)
        'Agregar referencia System.Web

        Dim clienteSMTP As New System.Net.Mail.SmtpClient("servidor.correo.es")
        Dim correo As New System.Net.Mail.MailMessage()
        Try
            'Valores de envío
            correo.To.Add(Destinatarios.ToString)
            correo.From = New System.Net.Mail.MailAddress("elfosodelsarlaccd@gmail.com")
            correo.Subject = "Traspaso Demeter"
            correo.Body = MensajeCorreo
            'Envio del correo
            clienteSMTP.Send(correo)
            EscribeLog(Now.ToString & " , Ok , Se ha enviado un correo de notificación a: " & correo.To.ToString)
        Catch ex As Exception
            EscribeLog(Now.ToString & " , Er , No se ha podido enviar un correo de notificación a: " & correo.To.ToString & " Motivo: " & ex.Message)
        End Try
    End Sub

    Public Sub EscribeLog(ByVal mensaje As String)
        If EscrituraLog = "Y" Then
            If Not FileSystem.DirectoryExists(RutaLog) Then
                Try
                    FileSystem.CreateDirectory(RutaLog.ToString)
                    EscribeLog(Now.ToString & " , In , No existe la carpeta destino de log " & (RutaLog.ToString) & " . Se procede a su creación.")
                Catch ex As Exception
                    EscribeLog(Now.ToString & " , Er , No se ha podido crear a carpeta destino de log " & (RutaLog.ToString))
                End Try
            End If

            Dim NombreLog As String = "Log_Persefone_" & Format(Now, "MM_yyyy") & ".log"
            Dim Escritor As New StreamWriter(RutaLog.ToString & NombreLog, True)

            Try
                Escritor.WriteLine(mensaje)
                Escritor.Close()
                Escritor = Nothing

            Catch ex As Exception
                EscribeLog(Now.ToString & " , Er , " & ex.Message)
            End Try
        Else
            Exit Sub
        End If
    End Sub

    Sub Main()
        LecturaConfiguracion()
        EscribeLog(Now.ToString & " , ++ , Iniciando Persefone")
        MoverFicheros()
        EscribeLog(Now.ToString & " , ++ , Finalizando Persefone")
    End Sub

End Module

Ahora programaremos una tarea de Windows para que ejeute Perséfone cuando deseemos.

No hay comentarios:

Publicar un comentario