Cliente FTP

Autor: Dámaso Velázquez Álvarez

Con la siguiente clase de ejemplo vamos a poder realizar operaciones de cliente FTP. Podremos hacer los siguientes tipos de petición:

  • Eliminar un fichero
  • Comprobar si existe un objeto
  • Crear un directorio
  • Subir un fichero
El código es el siguiente:
Imports System.Net.FtpWebRequest
Imports System.Net
Imports System.IO

Public Class Ftp

   Dim host, user, pass As String

   Public Sub New(ByVal host As String, ByVal user As String, ByVal pass As String)
      Me.host = host
      Me.user = user
      Me.pass = pass
   End Sub

   Public Function eliminarFichero(ByVal fichero As String) As String
      Dim peticionFTP As FtpWebRequest

      ' Creamos una petición FTP con la dirección del fichero a eliminar
      peticionFTP = CType(WebRequest.Create(New Uri(fichero)), FtpWebRequest)

      ' Fijamos el usuario y la contraseña de la petición
      peticionFTP.Credentials = New NetworkCredential(user, pass)

      ' Seleccionamos el comando que vamos a utilizar: Eliminar un fichero
      peticionFTP.Method = WebRequestMethods.Ftp.DeleteFile
      peticionFTP.UsePassive = False

      Try
         Dim respuestaFTP As FtpWebResponse
         respuestaFTP = CType(peticionFTP.GetResponse(), FtpWebResponse)
         respuestaFTP.Close()
         ' Si todo ha ido bien, devolvemos String.Empty
         Return String.Empty
      Catch ex As Exception
         ' Si se produce algún fallo, se devolverá el mensaje del error
         Return ex.Message
      End Try
   End Function

   Public Function existeObjeto(ByVal dir As String) As Boolean
      Dim peticionFTP As FtpWebRequest

      ' Creamos una peticion FTP con la dirección del objeto que queremos saber si existe
      peticionFTP = CType(WebRequest.Create(New Uri(dir)), FtpWebRequest)

      ' Fijamos el usuario y la contraseña de la petición
      peticionFTP.Credentials = New NetworkCredential(user, pass)

      ' Para saber si el objeto existe, solicitamos la fecha de creación del mismo
      peticionFTP.Method = WebRequestMethods.Ftp.GetDateTimestamp

      peticionFTP.UsePassive = False

      Try
         ' Si el objeto existe, se devolverá True
         Dim respuestaFTP As FtpWebResponse
         respuestaFTP = CType(peticionFTP.GetResponse(), FtpWebResponse)
         Return True
      Catch ex As Exception
         ' Si el objeto no existe, se producirá un error y al entrar por el Catch
         ' se devolverá falso
         Return False
      End Try
   End Function

   Public Function creaDirectorio(ByVal dir As String) As String
      Dim peticionFTP As FtpWebRequest

      ' Creamos una peticion FTP con la dirección del directorio que queremos crear
      peticionFTP = CType(WebRequest.Create(New Uri(dir)), FtpWebRequest)

      ' Fijamos el usuario y la contraseña de la petición
      peticionFTP.Credentials = New NetworkCredential(user, pass)

      ' Seleccionamos el comando que vamos a utilizar: Crear un directorio
      peticionFTP.Method = WebRequestMethods.Ftp.MakeDirectory

      Try
         Dim respuesta As FtpWebResponse
         respuesta = CType(peticionFTP.GetResponse(), FtpWebResponse)
         respuesta.Close()
         ' Si todo ha ido bien, se devolverá String.Empty
         Return String.Empty
      Catch ex As Exception
         ' Si se produce algún fallo, se devolverá el mensaje del error
         Return ex.Message
      End Try
   End Function

   Public Function subirFichero(ByVal fichero As String, ByVal destino As String, _
   ByVal dir As String) As String
      Dim infoFichero As New FileInfo(fichero)

      Dim uri As String
      uri = destino

      ' Si no existe el directorio, lo creamos
      If Not existeObjeto(dir) Then
         creaDirectorio(dir)
      End If

      Dim peticionFTP As FtpWebRequest

      ' Creamos una peticion FTP con la dirección del fichero que vamos a subir
      peticionFTP = CType(FtpWebRequest.Create(New Uri(destino)), FtpWebRequest)

      ' Fijamos el usuario y la contraseña de la petición
      peticionFTP.Credentials = New NetworkCredential(user, pass)

      peticionFTP.KeepAlive = False
      peticionFTP.UsePassive = False

      ' Seleccionamos el comando que vamos a utilizar: Subir un fichero
      peticionFTP.Method = WebRequestMethods.Ftp.UploadFile

      ' Especificamos el tipo de transferencia de datos
      peticionFTP.UseBinary = True

      ' Informamos al servidor sobre el tamaño del fichero que vamos a subir
      peticionFTP.ContentLength = infoFichero.Length

      ' Fijamos un buffer de 2KB
      Dim longitudBuffer As Integer
      longitudBuffer = 2048
      Dim lector As Byte() = New Byte(2048) {}

      Dim num As Integer

      ' Abrimos el fichero para subirlo
      Dim fs As FileStream
      fs = infoFichero.OpenRead()

      Try
         Dim escritor As Stream
         escritor = peticionFTP.GetRequestStream()

         ' Leemos 2 KB del fichero en cada iteración
         num = fs.Read(lector, 0, longitudBuffer)

         While (num <> 0)
            ' Escribimos el contenido del flujo de lectura en el
            ' flujo de escritura del comando FTP
            escritor.Write(lector, 0, num)
            num = fs.Read(lector, 0, longitudBuffer)
         End While

         escritor.Close()
         fs.Close()
         ' Si todo ha ido bien, se devolverá String.Empty
         Return String.Empty
      Catch ex As Exception
         ' Si se produce algún fallo, se devolverá el mensaje del error
         Return ex.Message
      End Try
   End Function
End Class

El método subirFichero recibe tres argumentos:

  • fichero: Ruta local del fichero
  • destino: Dirección FTP del destino del fichero. Ej: "ftp://direccion_de_ejemplo/directorio/fichero.txt"
  • dir: Dirección FTP del directorio donde se almacenará el fichero. Ej: "ftp://direccion_de_ejemplo/directorio"