none
¿Como puedo descargar zip aleatorio de un ftp? RRS feed

  • Pregunta

  • Hola buenas, estoy intentando crear una lista con url de un fpt, pero cuando lo depuro me crea el directorio y el directorio siguiente en vez de ser el subdirectorio es el mismo nombre que el directorio anterior, no se como hacerlo a sin que necesito ayuda, para mi es algo complicado, me podrían decir que estoy haciendo mal y que me falta para lograr lo que quiero hacer.
    Gracias.

    private string[] DirectoryListing(string ServerAdress, string Login, string Password)
            {
                List<string> result = new List<string>();
                Queue<string> folders = new Queue<string>();
                folders.Enqueue(ServerAdress);
                while (folders.Count > 0)
                {
                    string fld = folders.Dequeue();
                    List<string> newFiles = new List<string>();
                    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ServerAdress);
                    request.Credentials = new NetworkCredential(Login, Password);
    
                    request.Method = WebRequestMethods.Ftp.ListDirectory;
    
                    FtpWebResponse response = (FtpWebResponse)request.GetResponse();
                    Stream responseStream = response.GetResponseStream();
                    StreamReader reader = new StreamReader(responseStream);
                    string line = reader.ReadLine();
                    
                    while (line != null)
                    {
                        newFiles.Add(line.Trim());
                        string dir = newFiles.First(x => line.EndsWith(x));
                        folders.Enqueue(fld + dir + "/");
                        line = reader.ReadLine();
                    }
    
    
                    result.AddRange(from f in newFiles select fld + f);
                    reader.Close();
                    response.Close();
                }
                
    
                return result.ToArray();
            }
    
    

    lunes, 23 de septiembre de 2019 15:26

Respuestas

  • hola

    En el codigo que nos muestras no veo que estes creando nada, solo listasal usar

    request.Method = WebRequestMethods.Ftp.ListDirectory;

    Que sentido tiene esto

    .First(x => line.EndsWith(x))

    o sea cada item que itera el linq que termine con el mismo nombre del item? eso no funciona

    La verdad no entiendo que quieres lograr, menos aun porque usas primero una Queue y despues pasas esto a un List<string>, no le veo sentido

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 23 de septiembre de 2019 15:59
  • igual ahora que veo en realidad con el EndsWith esta buscando sobre otra lista

    pero esta muy raro que en el mismo loop agregas aqui

     newFiles.Add(line.Trim());

    a esa lista y tambien buscas si termina en la linea siguiente, por eso decial que agregas la linea en la lista que despues buscas si termina

    Si tendrias una lista externa que cargaste con otro proceso y buscas esa linea en este loop entonces si tendria sentido, pero todo en la misma accion no llego a enteder cual es la finalidad

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 23 de septiembre de 2019 18:55

Todas las respuestas

  • hola

    En el codigo que nos muestras no veo que estes creando nada, solo listasal usar

    request.Method = WebRequestMethods.Ftp.ListDirectory;

    Que sentido tiene esto

    .First(x => line.EndsWith(x))

    o sea cada item que itera el linq que termine con el mismo nombre del item? eso no funciona

    La verdad no entiendo que quieres lograr, menos aun porque usas primero una Queue y despues pasas esto a un List<string>, no le veo sentido

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 23 de septiembre de 2019 15:59
  • Hola Leandro, ya decía yo lo saque de de otras web en ingles, yo tampoco le veo sentido mucho pero algo hace parecido a lo que quiero seguiré sangrando mas el código a ver que hago.

    Gracias por los comentarios.

    lunes, 23 de septiembre de 2019 18:34
  • igual ahora que veo en realidad con el EndsWith esta buscando sobre otra lista

    pero esta muy raro que en el mismo loop agregas aqui

     newFiles.Add(line.Trim());

    a esa lista y tambien buscas si termina en la linea siguiente, por eso decial que agregas la linea en la lista que despues buscas si termina

    Si tendrias una lista externa que cargaste con otro proceso y buscas esa linea en este loop entonces si tendria sentido, pero todo en la misma accion no llego a enteder cual es la finalidad

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 23 de septiembre de 2019 18:55
  • La finalidad es crear una lista de direcciones ftp de archivos zip y elegir una de ellas aleatoria a sin puedo pasar el url ftp a un sistema de descarga.

    Gracias por tu ayuda Leandro.

    lunes, 23 de septiembre de 2019 19:06
  • Hola, mira este es el código de donde lo saque y modifique poniendo este codigo me da una url completa pero a mi me interesa que me de el anclaje,
    ftp://ip/"esto es lo que quiero que me de" no la dirección completa y a demás que elija entre las ubicaciones que haya.
    Y ademas que elija solo zip.

    Ejemplo:

    /user1/carpeta/archivo.zip "esto es lo que quiero".

    /user1/carpeta/archivo.png "o cualquier otro no se escoja pase de la ubicación".

    ftp://ip/user/carpeta/archivo.zip "esto es lo que me da".

    private string[] DirectoryListing(string ServerAdress, string Login, string Password)
            {
                List<string> files = new List<string>();
                Queue<string> folders = new Queue<string>();
                folders.Enqueue(ServerAdress);
    
                while (folders.Count > 0)
                {
                    string fld = folders.Dequeue();
                    List<string> newFiles = new List<string>();
    
                    FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(fld);
                    ftp.Credentials = new NetworkCredential(Login, Password);
                    ftp.UsePassive = false;
                    ftp.Method = WebRequestMethods.Ftp.ListDirectory;
                    using (StreamReader resp = new StreamReader(ftp.GetResponse().GetResponseStream()))
                    {
                        string line = resp.ReadLine();
                        while (line != null)
                        {
                            newFiles.Add(line.Trim());
                            line = resp.ReadLine();
                        }
                    }
    
                    ftp = (FtpWebRequest)WebRequest.Create(fld);
                    ftp.Credentials = new NetworkCredential(Login, Password);
                    ftp.UsePassive = false;
                    ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
                    using (StreamReader resp = new StreamReader(ftp.GetResponse().GetResponseStream()))
                    {
                        string line = resp.ReadLine();
                        while (line != null)
                        {
                            if (line.Trim().ToLower().StartsWith("d") || line.Contains(" <DIR> "))
                            {
                                string dir = newFiles.First(x => line.EndsWith(x));
                                newFiles.Remove(dir);
                                folders.Enqueue(fld + dir + "/");
                            }
                            line = resp.ReadLine();
                        }
                    }
                    files.AddRange(from f in newFiles select fld + f);
                }
                return files.ToArray();
            }

    Como descargo desde la ubicación que me de.

    string[] files = DirectoryListing("ftp://192.168.1.131/", "*****", "*****");
         foreach (string file in files)
         {
            
                 FtpWebRequest request2 = (FtpWebRequest)WebRequest.Create("ftp://192.168.1.131/" + file);
                 request2.Credentials = new NetworkCredential("*****", "******");
                 request2.Method = WebRequestMethods.Ftp.DownloadFile;
    
                 using (Stream ftpStream = request2.GetResponse().GetResponseStream())
                 using (Stream fileStream = File.Create(output))
                 {
                      ftpStream.CopyTo(fileStream);
                 }
         }



    • Editado brok4d jueves, 26 de septiembre de 2019 9:07
    lunes, 23 de septiembre de 2019 20:33
  • Ya lo solucione lo de la descarga solo me falta que cree una lista de ubicaciones y elija una para descargar

    //esto
    tpWebRequest request2 = (FtpWebRequest)WebRequest.Create("ftp://192.168.1.131/" + file);
    //por esto
    
    FtpWebRequest request2 = (FtpWebRequest)WebRequest.Create( file);

    lunes, 23 de septiembre de 2019 21:39
  • Hola de nuevo, ya conseguí que me diera una url aleatoria solo me falta que elija solo los zip y no escoja los png que hay.

    Gracias.

    private string UrlArrayRamdom()
    {
        string[] files = DirectoryListing("ftp://ip/", "*****", "******");
        var random = new Random();
        int index = random.Next(files.Length);
        string url = files[index];
        return url;
    }

    martes, 24 de septiembre de 2019 15:03