Agente SFTP

Servicio de escritorio desarrollado durante las prácticas en empresa que monitoriza hasta 10 carpetas locales de forma simultánea y sube automáticamente los archivos detectados a sus respectivos servidores SFTP, ejecutándose en segundo plano desde la bandeja del sistema de Windows.

Cada origen se configura de forma independiente en un archivo config.ini externo — servidor, credenciales cifradas, carpeta local y frecuencia de revisión — sin necesidad de recompilar la aplicación para adaptarla a nuevos entornos o máquinas.

Funcionalidades clave

Tecnologías usadas

Lenguaje: C#

Framework: .NET 8, Windows Forms

Protocolo: SFTP mediante SSH.NET (Renci.SshNet)

Criptografía: AES (integración con EncryptorACX)

Otros: System.Timers, BlockingCollection, NotifyIcon, parser INI personalizado.

Galería de pantallas

Icono en bandeja del sistema con menú contextual
Bandeja del sistema
Log de actividad en tiempo real
Log de actividad

Decisiones técnicas

BlockingCollection para escritura de logs: Las entradas de log se encolan y procesan en un hilo dedicado de larga duración, evitando que las escrituras en disco bloqueen los timers de subida cuando varios orígenes generan eventos simultáneamente.

Reintentos inteligentes: El sistema reintenta automáticamente en errores de red o servidor no disponible, pero interrumpe inmediatamente ante errores de autenticación — reintentar en ese caso sería inútil y podría bloquear la cuenta en el servidor.

Verificación de archivo disponible: Antes de cada subida se intenta abrir el archivo en modo exclusivo. Si está bloqueado por otro proceso — por ejemplo, está siendo generado o copiado — se omite en esa iteración y se reintentará en el siguiente ciclo del timer.

Parser INI propio: Se implementó un lector de archivos .ini desde cero sin librerías externas, parseando secciones y claves línea a línea con soporte de comentarios y tolerancia a espacios.

Frecuencia mínima con aviso: Si se configura una frecuencia menor de 5 segundos, la aplicación la eleva automáticamente al mínimo y registra un warning en el log en lugar de lanzar una excepción, priorizando la robustez frente al error de configuración.