sábado, 30 de octubre de 2021

Algoritmos evolutivos y descenso de gradiente

 En esta entrada veremos el concepto y las características de los algoritmos evolutivos, los algoritmos genéticos y el descenso de gradiente.

El objetivo de implementar redes neuronales es lograr un aprendizaje optimizado de los modelos informáticos. La informática evolutiva es un grupo de algoritmos destinados a la optimización. Y están fuertemente inspirados por la evolución biológica. La idea fundamental detrás de la computación evolutiva es impulsar un conjunto de soluciones que se generen y actualicen de forma iterativa. Hay tres algoritmos esenciales que evolucionaron a partir de propiedades matemáticas y genéticas. Y comparten algunas características comunes que se derivan de la computación evolutiva. El primero es el algoritmo evolutivo, el segundo es el algoritmo genético y el tercero es el gradiente de descenso. El algoritmo evolutivo es esencialmente un algoritmo de optimización genérico basado en poblaciones, se utiliza de forma destacada para realizar aproximaciones de soluciones para los problemas identificados o dados. El algoritmo genético se considera uno de los algoritmos evolutivos más populares, que generalmente se usa para problemas de optimización, está inspirado en los principios biológicos de recombinación y mutación. El algoritmo de descenso de gradiente, es otro algoritmo de optimización esencial que se utiliza de forma destacada para minimizar las funciones de coste y actualizar los parámetros de los modelos de redes neuronales. Los parámetros pueden ser coeficientes para regresión lineal o pesos para redes neuronales. 

 

Algoritmos evolutivos y descenso de gradiente

Algoritmos evolutivos

Se considera un subconjunto de la computación evolutiva. Se implementan en sistemas informáticos y resuelven problemas incorporando las técnicas de algoritmo evolutivo, evolución diferencial, algoritmo genético y búsqueda. El algoritmo evolutivo utiliza ciertos mecanismos que se inspiran en la evolución biológica. La evolución biológica se refiere a cualquier cambio genético en una población que se hereda durante varias generaciones. 

La imagen muestra el diagrama de flujo que involucra la implementación de algoritmos evolutivos. La implementación es un proceso iterativo y comenzamos generando la población inicial. Después de haber generado la población inicial, calcularemos los valores de aptitud.

 

Algoritmos evolutivos

Si hemos alcanzado la condición de optimización o el umbral de aptitud, finalizamos el proceso. De lo contrario, generaremos una nueva población, calcularemos la aptitud y evaluaremos hasta que hayamos alcanzado el umbral de valor de aptitud óptima o la condición de optimización. 

Algoritmos genéticos

Se inspiran en el proceso de selección natural. Con la implementación de este algoritmo, seleccionamos una parte de la población existente de generaciones sucesivas para crear una nueva generación y luego aplicamos procesos basados en la aptitud.

Los algoritmos genéticos se utilizan para generar soluciones de alta calidad para manejar y gestionar problemas de optimización y búsqueda. Las soluciones se construyen utilizando funciones de aptitud que se definen sobre representaciones genéticas, lo que a su vez proporciona la capacidad de medir la calidad de las soluciones generadas. El algoritmo genético se basa en la teoría de la evolución propuesta por Charles Darwin. Un enfoque científico que explica y predice fenómenos que ocurren naturalmente en base a observaciones y experimentación.

 

Algoritmos genéticos

La figura muestra el diagrama de flujo de la implementación de algoritmos genéticos. El proceso comienza con el muestreo de la población inicial. Después se aplica el proceso de selección, mejoramiento, cruce y transformación para generar una nueva población. Todo el proceso se repite hasta que hayamos obtenido una población correctamente ajustada.

Descenso de gradiente

Es otro algoritmo esencial que se utiliza con frecuencia en el aprendizaje automático y el aprendizaje profundo para optimizar los modelos. Es un algoritmo de optimización iterativo de primer orden que podemos usar para encontrar el mínimo de una función. El descenso de gradiente se puede implementar de forma iterativa para identificar los parámetros óptimos para los modelos. Se implementa ampliamente para derivar el mínimo local de una función y también se utiliza para entrenar redes neuronales.

Para optimizar los modelos y derivar el mínimo local de una función, el descenso de gradiente utiliza tres parámetros importantes. Estos parámetros incluyen ponderaciones, sesgos y función de costos. Para mejorar un conjunto dado de ponderaciones, obtenemos el valor de la función de costo para dichas ponderaciones y calculamos el gradiente. Después nos movemos en una dirección que reduzca la función de costo, Comenzamos inicializando los pesos al azar, luego calculamos el gradiente de la función de costo con respecto a los parámetros. Esto se hace mediante diferenciación parcial. Pues el valor del gradiente depende de la entrada, los valores actuales de los parámetros del modelo y de la función de costo. Después, se actualizan los pesos con valores proporcionales a los valores del gradiente.  

E iteramos los primeros tres pasos hasta que los valores de la función de costo dejen de reducirse. Cuando estamos actualizando los pesos, implica una tasa de aprendizaje. Y esta tasa de aprendizaje determina el tamaño de los pasos que damos para alcanzar un mínimo. Debemos ser cautelosos al definir la tasa de aprendizaje. Una tasa de aprendizaje alta puede superar el mínimo y una tasa de apren


sábado, 23 de octubre de 2021

El ciclo de vida de los datos

Existe un período de tiempo en el que los datos tienen utilidad para una organización, y esto se denomina ciclo de vida de los datos. Se refiere a la vida útil que tienen los datos y está dividido en varias fases diferentes. La gestión de datos debe aplicarse a cada fase,  por lo tanto, debemos asegurarnos de gestionar los datos correctamente desde su inicio, su creación, hasta su eventual desmantelamiento o eliminación. Y a menudo tenemos que hacer esto para el cumplimiento legal y regulatorio. Por supuesto, también debemos asegurarnos de cumplir con las pautas de gestión de la política de datos de la organización. Las políticas de seguridad también dictarán cómo se tratan los datos a lo largo de su vida útil. El ciclo de vida de los datos, que se enumera aquí, comienza con la creación. después, el almacenamiento, uso e intercambio de datos.

El ciclo de vida de los datos

Crear

La creación de datos puede presentarse de muchas formas diferentes. Por ejemplo recopilación de datos. Ya sea a través de formularios on-line o físicos que escaneamos.  Realizando encuestas, métricas para anuncios que pueden rastrear ciertas preferencias de un usuario y luego mostrar los anuncios adecuados. Métricas de dispositivos de IoT que se envían de vuelta a un repositorio central. Incluso las cookies del navegador web se pueden utilizar para recopilar datos sobre las preferencias del usuario y los sitios visitados. Incluso cosas como el escaneo de códigos de barras para fines de control de inventario. Podemos automatizar acciones relacionadas con la creación de datos.

El ciclo de vida de los datos, creación
La clasificación de datos también es importante para organizar los diferentes tipos de datos a los que tenemos acceso. Y también pueden relacionarse con los datos con los que deben archivarse o qué datos deben almacenarse en los medios de almacenamiento más rápidos. También es importante saber que datos necesitan cifrado. Podemos automatizar el cifrado de datos, de modo que a medida que introducimos los datos en la  nube, se cifren automáticamente. También podemos hacerlo localmente encriptando una carpeta de Windows utilizando un sistema de encriptación.

Almacenar

Una de las consideraciones para el almacenamiento es la accesibilidad a los datos. La alta disponibilidad significa que los datos están disponibles cuando se necesitan. Y eso se puede lograr de muchas formas diferentes, como mediante el uso de técnicas de organización de disco, como RAID 1. El nivel 1 de RAID se denomina duplicación de disco. Requiere al menos dos discos, donde todos los datos que se escriben en una partición de disco también se reflejan o se escriben en el segundo disco. Así que siempre tenemos una segunda copia de los datos actualizados. También podríamos habilitar RAID 5, que requiere un mínimo de tres discos, donde tenemos bandas de discos con paridad distribuida. De modo que cuando se escriben datos en la matriz de discos RAID 5, los datos están divididos en trozos más pequeños escritos en esos discos. Tenemos varios discos trabajando juntos como uno. La paridad distribuida significa que la información de recuperación se escribe en una variedad de diferentes discos dentro del sistema RAID 5. Y puede tolerar la falla de un disco.

El ciclo de vida de los datos, almacenamiento
También podríamos proporcionar alta disponibilidad de datos a través de la replicación. Al replicar los datos en otra ubicación, tenemos esos datos disponibles allí. Ahora, la pregunta es ¿Con qué frecuencia estamos replicando datos entre estos diferentes conjuntos de réplicas? El almacenamiento también incluye la clasificación de datos, como comentamos, para organizar nuestros datos. Que también se puede utilizar para asignar permisos a datos clasificados de cierta manera. Y tenemos que pensar en el cifrado de datos que están en reposo o en medios de almacenamiento, utilizando una variedad de algoritmos de cifrado. Es posible que tengamos que usar un tipo específico de algoritmo de cifrado, como AES-256, para cumplir con ciertas regulaciones.

Utilizar

Debemos adherirnos al principio de privilegio mínimo, o PoLP, donde solo se asignan los permisos necesarios para realizar una función de trabajo para el uso de datos, y nada más. También podemos auditar el uso de datos para determinar si se está abusando de los privilegios, si los privilegios se están utilizando correctamente o si necesitamos otorgar o revocar permisos. Solo lo sabremos si auditamos datos a lo largo del tiempo.

El ciclo de vida de los datos, utilizar


También podemos configurar la prevención de pérdida de datos o políticas DLP. Las políticas de DLP generalmente requieren un agente de software en los dispositivos del usuario que monitorea cómo se manejan los datos confidenciales. Y evita que, por ejemplo, se envíe fuera de la empresa a través del uso de las redes sociales o mediante archivos adjuntos de correo electrónico. El uso también incluye resumir datos en informes.

Compartir

Puede ser interna o externamente. Por ejemplo, podríamos tener datos que deben compartirse en un servidor de archivos con acceso controlado a algunos empleados dentro de la organización. O podríamos compartir datos externamente, con datos clasificados como públicos. También podemos controlar nuestro intercambio utilizando las leyes de privacidad de datos como pautas y regulaciones. Las políticas de prevención de pérdida de datos, o DLP, se aplican nuevamente a la fase de uso compartido. Queremos asegurarnos de que estamos compartiendo datos de manera adecuada, solo con las partes que deberían tener acceso a esos datos. Por lo tanto, debemos controlar el intercambio de información confidencial, como información de identificación personal, PII o información médica protegida, PHI.

El ciclo de vida de los datos, compartir
Y nuevamente, eso suele estar bajo el paraguas de las regulaciones que determinan cómo se recopilan, usan y comparten esos datos. Por lo tanto, también podemos limitar la cantidad de custodios de datos, aquellos administradores de datos que tienen acceso a los datos y controlan los permisos. Por lo tanto, la custodia de datos establece permisos sobre los datos de acuerdo con las políticas de seguridad de la organización.

Archivar

Debemos establecer políticas de respaldo de datos. También contamos con políticas de retención de datos que pueden estipular que la copia de seguridad o el archivo de datos a largo plazo se realice en un medio de almacenamiento diferente al de la copia de seguridad de datos normal. Quizás la copia de seguridad de datos regular vaya a la biblioteca de copias de seguridad en cinta de red del área de almacenamiento. Mientras que la retención o el archivo de datos a largo plazo pueden ir a la nube en medios de almacenamiento lentos, ya que no se accede a ellos con frecuencia. También tenemos que determinar si los datos archivados están encriptados o no para su custodia, y eso podría ser requerido por leyes o regulaciones. 

El ciclo de vida de los datos, archivar

La migración de datos a medios de almacenamiento de rendimiento lento puede ser un proceso automatizado. Por lo tanto, podemos implementar políticas que digan, por ejemplo, que queremos mover datos a los que no se ha accedido en 60 días a medios de almacenamiento más lentos. De este modo liberando espacio para un rendimiento más rápido.

Eliminar

Consiste en la eliminación de los datos una vez que han llegado al final de su vida útil los datos deben ser eliminados. Esto tiene que hacerse de acuerdo con las leyes, regulaciones y políticas organizacionales que pueden tener reglas que determinen qué período de tiempo debe transcurrir antes de que los datos se puedan eliminar de forma permanente. Este lapso de tiempo es muy importante. Además, tenemos que considerar cómo se eliminan esos datos. Incluso puede ser necesaria la destrucción física de dispositivos de almacenamiento.

El ciclo de vida de los datos, eliminar
O borrado de datos, utilizando herramientas que evitan que los datos se recuperen, a menudo esto se consigue sobrescribiendo en múltiples pasadas en dispositivos de disco. Además, debemos considerar la posibilidad de borrar datos utilizando algunas herramientas del sistema operativo, o de aplicaciones de terceros, para borrar datos de forma segura.


sábado, 16 de octubre de 2021

Componentes de construcción de redes neuronales

En esta entrada veremos los bloques de construcción y componentes esenciales que se utilizan o participan en la construcción de redes neuronales artificiales. Veremos la arquitectura de estas, y los componentes que se utilizan para construir el modelo correcto para dar soluciones predictivas a diversas aplicaciones comerciales. Los componentes principales incluyen las capas de entrada de salida y ocultas.

Las capas están formadas por distintas neuronas con enlaces de conexión que conectan las neuronas para facilitar el flujo de información. Existen varios tipos de redes neuronales que podemos construir alineando los elementos arquitectónicos según nuestros requisitos. Por ejemplo, podemos construir una red neuronal directa, una red neuronal de retroalimentación, o una red recurrente, donde las salidas alimentan de nuevo las entradas. En la figura inferior se muestra un esquema de la arquitectura de una red neuronal de alimentación directa, donde la información fluye solo en una dirección.

 

Red neuronal directa

Podemos observar un flujo de información unidireccional. Comienza desde la capa de entrada y termina en la capa de salida. No existe el concepto de retroalimentación o bucles en las redes neuronales directas. Y a menudo se las conoce como redes neuronales sencillas que identifican directamente la relación entre las entradas y las salidas. La implementación de redes neuronales de alimentación directa se puede encontrar en aplicaciones que involucran generación de patrones, reconocimiento de patrones y clasificación. 

En una red de retroalimentación el flujo de información es bidireccional, este tipo de red involucra bucles de retroalimentación. En este caso,  el estado de la red tiende a cambiar con frecuencia, también se conoce comúnmente como red neuronal dinámica. Podemos observar claramente el flujo de información bidireccional causado por los bucles de retroalimentación de la figura.

 

Red neuronal con realimentación

La tercera figura ilustra la arquitectura de una red neuronal recurrente. Esta red en particular utiliza memoria para almacenar toda la información de los pasos anteriores para facilitar el siguiente paso de aprendizaje.

Red neuronal recurrente

La figura ilustra el uso de la información de los pasos anteriores o del estado anterior para generar el estado actual. Con las redes neuronales tradicionales, las entradas y las salidas tienden a ser independientes entre sí. Pero surgen ciertos escenarios en los que necesitaríamos la red neuronal para almacenar y utilizar resultados anteriores. Tales escenarios requieren la implementación de una arquitectura de red neuronal recurrente. 

La estructura de una red neuronal artificial está inspirada en el cerebro humano, el cual está formado por una gran cantidad de elementos de procesamiento altamente conectados llamados neuronas. Podemos configurar redes neuronales artificiales con tareas específicas mediante un proceso de aprendizaje que imita al sistema biológico.

Las neuronas de las redes neuronales artificiales suelen estar organizadas en tres capas diferentes, la capa de entrada, la capa oculta y la capa de salida.

 

Estructura general de una red neuronal

Como buena práctica, se sugiere que combinemos redes neuronales usando reglas de lógica estructurada. 

Para entrenar una red neuronal necesitamos entrenarla con unos datos, y ajustar algunos parámetros para inicializar la red y evitar el sobreajuste o sesgo de esta. Después de inicializar la red neuronal, tenemos que iniciar el proceso de aprendizaje que generalmente es de naturaleza iterativa y repite ciertos pasos para cada parámetro de entrada. A continuación creamos una muestra  o lote que es un subconjunto de los datos de entrenamiento, Con cada salida de la red comparamos los datos obtenidos con la muestra y se reajusta la red con el objetivo de que el próximo paso la salida esté más cercana a la que debería tener. 

Repetiremos estos pasos hasta que la salida de la red converja y se ajuste a nuestro modelo. Finalmente, cuando termina la iteración, el resultado que obtenemos es una red entrenada.

Ahora, veremos algunos de los parámetros esenciales que juegan un papel crítico e importante en la construcción de redes neuronales. El primer tipo de parámetros es la arquitectura del modelo. Debemos controlar el número de capas, el número de neuronas por capa y el tipo de capa, ya sea de entrada, salida u oculta.

El segundo tipo de parámetro es el parámetro a tener en cuenta es la función de aprendizaje. Este parámetro en particular ayuda a orientar el enfoque y la tasa de aprendizaje que podemos establecer para optimizar el proceso de aprendizaje. Uno de los parámetros de aprendizaje más importantes en uso es la tasa de aprendizaje. Si establecemos una tasa de aprendizaje pequeña, el proceso de aprendizaje puede llevar mucho tiempo. Y si establecemos una gran tasa de aprendizaje, puede afectar negativamente el rendimiento del aprendizaje.

Otro tipo de parámetro es el parámetro de optimización. Este parámetro se utiliza para optimizar el modelo de red neuronal. Algunos de los parámetros de optimización esenciales que debemos configurar incluyen el tamaño del lote, el impulso y los pesos. El último parámetro es el parámetro de ajuste. Los parámetros de ajuste se utilizan para ajustar las redes con el fin de proporcionar mejores resultados de aprendizaje después de haber aplicado los datos de entrada.

Algunos de los parámetros de ajuste esenciales incluyen el número de épocas y el tamaño del lote


sábado, 9 de octubre de 2021

Privacidad de datos

Uno de los mayores desafíos en el uso de los sistemas informáticos actuales se relaciona con la privacidad de los datos. Y esto se aplicaría a individuos, agencias gubernamentales y organizaciones. Por eso es importante que las organizaciones creen e implementen políticas de seguridad y privacidad. Los usuarios finales deben saber que existen políticas de seguridad. Y cuáles son los procedimientos adecuados en la protección de datos. Pero también, es importante que los usuarios comprendan la relevancia de por qué existen esas políticas de seguridad.

Privacidad de datos
La privacidad de los datos se puede lograr de muchas formas, incluida la seguridad física. Por ejemplo, cerraduras de puertas , ventanas y sistemas de alarma. Además, los controles técnicos de seguridad pueden proteger los datos en forma de cortafuegos, que pueden implementarse en el borde de la red para controlar el tráfico que entra y sale de la red. O firewalls implementados en todos y cada uno de los dispositivos informáticos para controlar el tráfico que entra y sale de esos dispositivos. También tenemos el cifrado y la codificación de datos. De modo que mientras se transmiten los datos, solo el poseedor de la clave de descifrado adecuada podrá ver los datos originales. Lo mismo se aplicaría a los datos en reposo o los datos que se están almacenandos y que deben protegerse de miradas indiscretas. También deberían estar cifrados. Para que las políticas de seguridad sigan siendo relevantes, debemos realizar una revisión periódica de las políticas. Pues las amenazas cambian con el tiempo y también las soluciones tecnológicas y los controles de seguridad existentes implementados para proteger los activos de datos podrían haber funcionado al mismo tiempo, pero podrían volverse cada vez menos efectivos con el tiempo. Es importante que revisemos estas cosas periódicamente para hacer mejoras para reforzar la seguridad. 

Información de identificación personal, o PII

Es cualquier cosa que identifique de forma única a un individuo. Puede ser el nombre, apellido, la dirección postal, el número de seguridad social, el número de la tarjeta de crédito. En cuanto a datos sanitarios, se conocen como información médica protegida o PHI. Esto incluiría los registros médicos de los pacientes, cómo se administró y pagó la atención médica, etc.

HIPAA, la Ley de responsabilidad de portabilidad de seguros médicos de Estados Unidos. Se ocupa de la protección de la PHI, información médica protegida o información médica. PIPEDA es una ley del Parlamento de Canadá. Significa Ley de Protección de Información Personal y Documentos Electrónicos. Y se ocupa de la recopilación y el uso del sector privado de información de identificación personal. GDPR es el Reglamento general de protección de datos 2016/679 de la Unión Europea. Es la recopilación y el uso de PII por parte del sector privado tanto dentro como fuera de la UE.

La Ley de Privacidad de 1988 se refiere a Australia. Una vez más, se trata de la protección de la PII. y es aplicable a agencias gubernamentales y al sector privado.  Estas leyes suelen incluir disposiciones relacionadas con la notificación de violación de datos a los usuarios afectados cuyos datos podrían haber sido comprometidos. PCI DSS no es una ley, son las siglas en inglés de Payment Card Industry Data Security Standard. Su enfoque es la protección de los datos de los titulares de tarjetas de débito y crédito para comercio a través de elementos como cifrado y firewalls, etc. El cifrado está realmente diseñado para proteger datos confidenciales, proporciona confidencialidad. Uno de sus requisitos, llamado 3.4, es el cifrado de los datos del titular de la tarjeta. Con el cifrado, los datos originales se denominan texto sin formato. Una vez que los datos se cifran o codifican, se denominan texto cifrado. 

Encriptado de datos
El texto sin formato se introduce en un algoritmo de cifrado. Un algoritmo de cifrado es realmente una fórmula matemática complicada. El texto sin formato se introduce en un algoritmo de cifrado con una clave y el resultado es texto cifrado. No podremos encontrar sentido a ese texto cifrado a menos que tengamos la clave de descifrado correcta.  

Suele utilizarse un cifrado simétrico esto significa que tenemos una clave única  que se usa para el cifrado y el descifrado. El problema es ¿cómo podemos hacer llegar esa clave de forma segura a través de Internet a todos los usuarios que la necesitan para el cifrado o descifrado? por eso encontraremos a menudo que el cifrado simétrico y asimétrico se utilizan juntos. 

Encriptación simétrica
El cifrado asimétrico, utiliza dos claves relacionadas matemáticamente. La clave pública se puede compartir públicamente con cualquier persona y no hay riesgo de seguridad. Está diseñada para esto. Sin embargo, no ocurre lo mismo con la clave privada. La clave privada debe mantenerse privada para el propietario de la clave. No debería compartirse con nadie. Imaginemos que estamos enviando un mensaje de correo electrónico encriptado a alguien. Para ello necesitamos la clave pública del destinatario. Para  descifrarlo, necesitamos la clave privada relacionada. Aquí es donde entra en juego el cifrado asimétrico. 

Encriptación asimétrica
Al final estamos hablando de privacidad de datos, y un aspecto de esto es cifrar los datos en reposo y los datos que se transmiten a través de una red. 


sábado, 2 de octubre de 2021

Subir y bajar archivos desde un servidor FTP con una aplicación de VB.Net

Para subir o bajar archivos desde un equipo local a una dirección FTP remota con Visual Basic.Net antes se utilizaba la librería de Visual Studio ftpWebRequest. Pero actualmente la documentación indica que dicha librería será descontinuada y que para nuevos desarrollos se utilicen librerías de terceros. Una librería muy utilizada es FluenFTP que es la que vamos a utilizar. Lo primero que vamos a hacer es descargar dicha librería, para ello desde nuestro proyecto en Visual Studio vamos al menú  de Proyecto y elegimos la opción Administrar paquetes NuGet.


Subir y bajar archivos desde un servidor FTP con una aplicación de VB.Net


Esto nos abre una pantalla desde al que podemos instalar en nuestra aplicación multitud de paquetes de terceros. En nuestro caso ponemos FTP en el buscador y nos muestra una lista de las librerías disponibles. Elegimos FluentFTP pulsamos el botón Instalar. Esto instala automáticamente la librería en nuestro proyecto. Ahora ya podemos utilizar esta librería desde nuestra aplicación.

 

Instalar FluentFTP



Para tener acceso a sus propiedades, funciones y métodos basta con poner la correspondiente llamada Imports, al comienzo de nuestra aplicación de Visual Basic.Net

 

Imports FluentFTP

 

El siguiente paso será definir un Objeto de la clase FTPClient, para ello escribimos

 

Dim client = New FtpClient(strFTP, strUsuario, strPassword)

 

Donde strFTP será una variable de tipo string que traerá la dirección del FTP, ojo, hay que tener en cuenta que será una dirección del tipo ftp://servidor.remoto.es/DIRECTORIO  Si no trae el ftp:// del principio se lo podemos añadir por programa con algo así:

 

strFTP = "ftp://" & strDireccionDestino

 

strUsuario y strPassword traerán el usuario y contraseña correspondientes para conectarnos al servidor FTP deseado. También debemos conectarnos al servidor. Con esta librería es tan fácil como escribir:

 

client.Connect()

 

Ahora lo que queremos es pasar un archivo desde un directorio de nuestro equipo a un FTP remoto. Escribimos la siguiente línea.

 

client.UploadFile(strDireccionOrigen & "\" & strNombreOrigen, strNombreDestino)

 

Donde en strDireccionOrigen vendrá una cadena con la dirección de nuestro equipo del tipo  “C:\Directorio\Subdirectorio” en strNombreOrigen vendrá el nombre de nuestro archivo de origen, y si deseamos nombrarlo con un nuevo nombre podemos almacenar el nuevo nombre en strNombreDestino o podemos enviar directamente strNombreOrigen en el segundo parámetro si deseamos que el archivo se llame igual que el del origen.

 

Si deseamos copiarlo en un subdirectorio del FTP podemos hacer

 

client.UploadFile(strDireccionOrigen & "\" & strNombreOrigen, strSubdirectorio_FTP & "/" & strNombreDestino)

 

Donde strSubdirectorio_FTP traerá el nombre del subdirectorio del tipo “/SUBDIRECTORIO” no siendo necesario escribir el nombre completo del FTP.

 

Esta función tiene varias sobrecargas, de modo que podemos hacer

 

client.UploadFile(strDireccionOrigen & "\" & strNombreOrigen, strSubdirectorios_FTP & "/" & strNombreDestino, FtpRemoteExists.Overwrite, True, FtpVerify.Retry)

 

Esta llamada Sobreescribe el archivo en destino si ya existe uno del mismo nombre. Esto lo hace el parámetro FtpRemoteExists.Overwrite, el siguiente parámetro True indica que si no existe el directorio en el destino lo crea, y el último parámetro FtpVerify.Retry verifica si se ha copiado el archivo correctamente en el FTP.

 

Finalmente cerramos la conexión

 

client.Disconnect()

 

Ahora vamos a traer un archivo desde FTP a nuestro equipo. Para ello creamos el objeto y abrimos la conexión igual que hicimos anteriormente

 

Dim client = New FtpClient(strFTP, strUsuario, strPassword)

client.Connect()

 

Ahora para traer el archivo desde el FTP remoto tenemos que hacer un For Each sobre los objetos del FTP remoto para traer todos los que encontremos

 

For Each item As FtpListItem In client.GetListing(strSubdirectorios_FTP)

                    client.DownloadFile(strDireccionDestino & item.FullName, item.FullName, FtpLocalExists.Overwrite)

                   

                    client.DeleteFile(item.FullName)

Next item

                   

En este caso, si el archivo se encuentra en un subdirectorio del FTP, nos lo creará en el destino indicado de nuestro equipo y escribirá los archivos en el directorio creado, estos vendrán en strSubdirectorios_FTP. Si el FTP no tiene subdirectorios podemos hacer strSubdirectorios_FTP = “”. Para no dejar los archivos copiados en el FTP de origen podemos borrarlos con

 

client.DeleteFile(item.FullName)

 

Terminamos igual que en el caso anterior con

 

client.Disconnect()

 

Finalmente dejo como podrían ser las dos Funciones para enviar y obtener ficheros desde nuestro equipo a un FTP.  Esta sería para llevar un archivo desde nuestro equipo al FTP remoto.

 

Private Function Trata_Archivo_FTP(ByVal Folder_file As Object,  ByVal strDireccionOrigen As String, ByVal strDireccionDestino As String, ByVal strUsuario As String, ByVal StrPassword As String) As Boolean

        Dim strNombreOrigen As String = ""

        Dim strNombreDestino As String = ""

        Dim strSubdirectorios_FTP As String = "/SUBDIR_FTP"

 

                Try

                

            'crea un cliente FTP

            Dim client = New FtpClient(strFTP, strUsuario, StrPassword)

            client.Connect()

 

            For Each File As FileInfo In Folder_file

                strNombreOrigen = File.Name

                strNombreDestino = File.Name

                    'sube un archivo a un FTP

                    client.UploadFile(strDireccionOrigen & "\" & strNombreOrigen, strSubdirectorios_FTP & "/" & strNombreDestino, FtpRemoteExists.Overwrite, True, FtpVerify.Retry)

                    'Como el origen del fichero no es FTP, borramos archivo en nuestro equipo

                    My.Computer.FileSystem.DeleteFile(strDireccionOrigen & "\" & strNombreOrigen)

        Next

            'desconecta FTP

            client.Disconnect()

            Trata_Archivo_FTP = False

        Catch ex As Exception

        End Try

    End Function

La función anterior recorre nuestro directorio local pasado en strDireccionOrigen para ver los archivos que tiene, para ello tiene como parámetro de entrada el objeto Folder_file. La llamada a esta función será de este estilo:

 

Dim folder As New DirectoryInfo(strDireccionOrigen)

bErrores = Trata_Archivo_FTP(folder.GetFiles(), strDireccionOrigen, strDireccionDestino, strUsuarioFTP, strPasswordFTP)

Una definición de la función para traer un archivo al equipo local desde un FTP podría ser de este estilo:

Private Function Trata_FTP_Archivo(ByVal strDireccionDestino As String, ByVal strUsuario As String, ByVal strPassword As String) As Boolean

        Dim strNombreOrigen As String = ""

        Dim strNombreDestino As String = ""

        Dim strSubdirectorios_FTP As String ="/SUBDIR_FTP"

 

        Try

 

            'crea un FTP cliente

            Dim client = New FtpClient(strFTP, strUsuario, strPassword)

            client.Connect()

            'Se trae todo lo que hay en el FTP remoto

            For Each item As FtpListItem In client.GetListing(strSubdirectorios_FTP)

               

                    client.DownloadFile(strDireccionDestino & item.FullName, item.FullName, FtpLocalExists.Overwrite)

               client.DeleteFile(item.FullName)

 

            Next ítem

            'desconecta

            client.Disconnect()

            Trata_FTP_Archivo = False

        Catch ex As Exception

            MsgBox(ex.Message)

        End Try

    End Function

Si queremos hacer un traspaso de FTP a FTP yo no he sido capaz de hacerlo directamente con FTPFluent, pero si llamando a estas dos  funciones descritas arriba alternativamente utilizando el directorio del equipo local C:\FTP como repositorio para almacenar los archivos traídos desde un FTP antes de enviarlos al FTP de destino.

Dim strAuxDireccion As String

bErrores = Trata_FTP_Archivo(strDireccionOrigen, "C:\FTP", strUsuarioFTP_Ori, strPasswordFTP_Ori)

Dim folder2 As New DirectoryInfo(strAuxDireccion)

 

bErrores = Trata_Archivo_FTP(folder2.GetFiles(),strAuxDireccion, strDireccionDestino, strUsuarioFTP_Des, strPasswordFTP_Des)

Hay que tener en cuenta, que si el FTP de origen tiene los archivos en un subdirectorio, creará el subdirectorio sobre C:\FTP con lo que tendremos que tratarlo para que no de error al leerlo de nuevo. Dentro de Trata_Archivo_FTP debemos sacar el subdirectorio creado con algo como esto:

Dim strFTP As String

Dim intPosBarra As Integer

            'Si la direccion FTP es un directorio separa el servidor y los subdirectorios

intPosBarra = InStr(strDireccionDestino, "/")

If intPosBarra <> 0 Then

      strSubdirectorios_FTP = Mid(strDireccionDestino, intPosBarra)

      strFTP = "ftp://" & Mid(strDireccionDestino, 1, intPosBarra)

Else

      strSubdirectorios_FTP = ""

      strFTP = "ftp://" & strDireccionDestino

End If

 

Y en Trata_FTP_Archivo, algo como esto

 

Dim intPosBarra As Integer

Dim strAuxDir() As String

            'Si la direccion FTP es un directorio separa el servidor y los subdirectorios

            intPosBarra = InStr(strDireccionOrigen, "/")

            If intPosBarra <> 0 Then

                strSubdirectorios_FTP = Mid(strDireccionOrigen, intPosBarra)

                strFTP = "ftp://" & Mid(strDireccionOrigen, 1, intPosBarra)

            Else

                strSubdirectorios_FTP = ""

                strFTP = "ftp://" & strDireccionOrigen

            End If