2011-06-01 32 views
6

Póster por primera vez, lector de larga duración. Tengo un problema realmente molesto que me está poniendo de los nervios. Tengo un programa configurado para que escuche nuevos archivos en un servidor FTP, si hay un archivo nuevo lo descargo. A partir de ahí, trabajo en parte de la información del archivo, etc. Mi problema surge cuando reviso mi secuencia la segunda vez. Es decir, en el primer archivo que descargo todo está totalmente bien, pero tan pronto como se detecta un nuevo archivo y mi programa intenta descargarlo, mi programa simplemente se cuelga.El programa se cuelga en FtpWebResponse

private static void DownloadFile(string s) 
    { 
     try 
     { 
      FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://blabla.com/"+s); 
      request.Method = WebRequestMethods.Ftp.DownloadFile; 
      request.Credentials = new NetworkCredential("xxx" ,"zzz"); 

      using (FtpWebResponse partResponse = (FtpWebResponse)request.GetResponse()) 
      { 
       Stream partReader = partResponse.GetResponseStream(); 

       byte[] buffer = new byte[1024]; 
       FileInfo fi = new FileInfo(path); 
       FileStream memStream = fi.Create(); 
       while (true) 
       { 
        int bytesRead = partReader.Read(buffer, 0, buffer.Length - 1); 
        if (bytesRead == 0) 
         break; 

        memStream.Write(buffer, 0, bytesRead); 
       } 
       partResponse.Close(); 
       memStream.Close(); 
      } 
      Console.WriteLine(DateTime.Now + " file downloaded"); 
      MoveFileToInProgress(s); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
     } 
    } 

La línea que cuelga de éste es: usando (FtpWebResponse partResponse = (FtpWebResponse) request.GetResponse())

La razón aquí mi método es estático porque está justo Im ejecutando en una proyecto diferente para probarlo ... Mi pregunta aquí es, ¿cómo es que solo muere en el segundo archivo? ¡He estado mirando a ciegas por horas!

Respuesta

0

no soy experto en C#, pero puedo usar este código para descargar archivos de mi ftp:

public void Download(string filename) 
    { 
     // I try to download five times before crash 
     for (int i = 1; i < 5; i++) 
     { 
      try 
      { 
       FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(Global.Path + "/" + filename); 
       ftp.Credentials = new NetworkCredential(User, Pass); 
       ftp.KeepAlive = false; 
       ftp.Method = WebRequestMethods.Ftp.DownloadFile; 
       ftp.UseBinary = true; 
       ftp.Proxy = null; 

       int buffLength = 2048; 
       byte[] buff = new byte[buffLength]; 
       int contentLen; 

       string LocalDirectory = Application.StartupPath.ToString() + "/downloads/" + filename; 
       using (FileStream fs = new FileStream(LocalDirectory, FileMode.Create, FileAccess.Write, FileShare.None)) 
       using (Stream strm = ftp.GetResponse().GetResponseStream()) 
       { 
        contentLen = strm.Read(buff, 0, buffLength); 
        while (contentLen != 0) 
        { 
         fs.Write(buff, 0, contentLen); 
         contentLen = strm.Read(buff, 0, buffLength); 
        } 
       } 

       Process.Start(LocalDirectory); 
       break; 
      } 
      catch (Exception exc) 
      { 
       if (i == 5) 
       { 
        MessageBox.Show("Can't download, try number: " + i + "/5 \n\n Error: " + exc.Message, 
         "Problem downloading the file"); 
       } 
      } 
     } 
    } 

Dime si funciona para ti :)

+0

Mi el programa aún se cuelga en la misma línea, en tu código se traduce a esta línea: using (Stream strm = ftp.GetResponse(). GetResponseStream()) Creo que tendré que buscar lugares donde no cerré la conexión FTP correctamente o algo ... – MartinNielsen

+1

Podría intentar tener un temporizador en un momento que se rompe y/o vuelve a intentar después de unos segundos (más tiempo si los procesos toman más tiempo) – Daanvl

+0

¿Alguna vez se dio cuenta de esto? mi código también se cuelga en los últimos bytes –

2

me encontré con este problema también ... intente terminar primero su solicitud y luego cerrarla antes de tratar de recuperar la respuesta. Eso funcionó para mí (en realidad lo probé después de leer el comentario de Martin Nielsen). Aquí esta lo que hice.

 // connect to the ftp site 
     FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(ftpUri); 
     ftpRequest.Method = WebRequestMethods.Ftp.UploadFile; 
     ftpRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword); 

     // setting proxy to null so that it does not go through the proxy 
     ftpRequest.Proxy = null; 

     // get file information 
     StreamReader fileStream = new StreamReader(filePath); 
     byte[] fileBytes = Encoding.UTF8.GetBytes(fileStream.ReadToEnd()); 
     ftpRequest.ContentLength = fileBytes.Length; 
     fileStream.Close(); 

     // open connection to ftp site 
     Stream ftpRequestStream = ftpRequest.GetRequestStream(); 

     // write the file to the stream 
     ftpRequestStream.Write(fileBytes, 0, fileBytes.Length); 

     // close the stream 
     ftpRequestStream.Close(); 

     // get the response from the server 
     FtpWebResponse ftpUploadResponse = (FtpWebResponse)ftpRequest.GetResponse(); 
     string result = ftpUploadResponse.StatusDescription; 

     // close response 
     ftpUploadResponse.Close(); 

     // return response to calling code 
     return result; 

Aquí hay un par de los recursos que utiliza al escribir el código (no me deja publicar más de 2, había más)

How to: Upload Files with FTP

Uploading a file -- "The requested URI is invalid for this FTP command"

+0

No entiendo por qué esta respuesta se sube? la pregunta es sobre descargar * no subir * un archivo. Y NO usa ninguna secuencia de solicitud que deba cerrarse. Entonces, ¿cómo podría considerarse una respuesta a la pregunta? –

Cuestiones relacionadas