2011-09-19 11 views
5

Estoy jugando con FtpWebRequest y me pregunto cómo puedo formatear el resultado?¿Cómo analizar esto? ftpWebRequest ListDirectorDetials

FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(""); 
     ftp.Credentials = new NetworkCredential("", ""); 
     ftp.KeepAlive = true; 
     ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 
     WebResponse response = ftp.GetResponse(); 
     StreamReader reader = new StreamReader(response 
             .GetResponseStream()); 

     string r = reader.ReadLine(); 
     response.Close(); 
     reader.Close(); 

puedo obtener resultados como este regreso

09-17-11 01:00AM    942038 my.zip 

lo que sería una buena manera de analizar esto en como un objeto decir algo como

public Class Test() 
{ 
    public DateTime DateCreated? {get; set;} 
    public int/long Size {get; set;} 
    public string Name {get; set;} 
} 

No estoy seguro de si debería usar una largo o int para el tamaño. Tampoco estoy seguro de qué fecha es en realidad si se crea, o se modifica o lo que sea.

+1

http://stackoverflow.com/questions/7060983/c-class-to-parse-webrequestmethods-ftp-listdirectorydetails-ftp-response – meziantou

Respuesta

7
var value = "09-17-11 01:00AM    942038 my.zip"; 
var tokens = value.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 
if (tokens.Length > 3) 
{ 
    var test = new Test 
    { 
     DateCreated = DateTime.ParseExact(tokens[0] + tokens[1], "MM-dd-yyHH:mmtt", CultureInfo.InvariantCulture), 
     Size = int.Parse(tokens[2]), 
     Name = tokens[3] 
    }; 

    // at this stage: 
    // test.DateCreated = 17/09/2011 01:00AM 
    // test.Size = 942038 
    // test.Name = "my.zip" 
} 
+0

Ah. No es de extrañar por qué no funcionó para mí. Lo acabo de hacer ''. Me preguntaba por qué no se estaba dividiendo. No estoy seguro de si esta es la mejor manera de hacerlo, ya que parece ser algo que tendrá que ser reparado constantemente (como si lo moviera a otro servicio podrían tener más campos) – chobo2

+0

@ chobo2, siempre podría usar un tercero control para hacer el análisis sintáctico y que funcionará en todos los casos (donde, por supuesto, tendrá que definir qué significa * todos los casos *). Solo he mostrado un ejemplo crudo utilizando clases BCL estándar que, por supuesto, funcionarán solo para este resultado específico. –

+0

Ya eso es lo que estoy buscando ahora. Estoy tratando de encontrar uno gratis. Intenté casi todo en nuget pero son de pago o no tienen directorio. Lista con tamaños de archivo. – chobo2

1

Una cosa molesta sobre el estándar FTP es que no especifica exactamente cómo debe formatearse el listado del directorio. En general, los listados devueltos por las máquinas * nix se parecen más a los directorios * nix y los devueltos por Windows a menudo se parecen mucho a una lista de DOS, pero usted tiene un código FTP antiguo que forma la base de productos más nuevos, de modo que existe IBM-4690 y AS400 cosas, VMS, Oracle, Novell y así sucesivamente.

Por lo tanto, si intenta hacer algo de propósito general en lugar de hacerlo para un servidor específico, entonces tiene que hacer un análisis bastante feo. Puede valer la pena comprar algo, pero no tengo ninguna recomendación.

0

Este es mi algoritmo para analizar ListDirectoryDetails. Separé el nombre de Archivo/Dir., Atributo, Fecha de creación y Tamaño en Lista. Espero que esto ayude ....

 FtpWebRequest _fwr = FtpWebRequest.Create(uri) as FtpWebRequest; 
     _fwr.Credentials = cred; 
     _fwr.UseBinary = true; 
     _fwr.UsePassive = true; 
     _fwr.KeepAlive = true; 
     _fwr.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 
     StreamReader _sr = new StreamReader(_fwr.GetResponse().GetResponseStream()); 

     List<object> _dirlist = new List<object>(); 
     List<object> _attlist = new List<object>(); 
     List<object> _datelist = new List<object>(); 
     List<long> _szlist = new List<long>(); 
     while (!_sr.EndOfStream) 
     { 
      string[] buf = _sr.ReadLine().Split(' '); 
      //string Att, Dir; 
      int numcnt = 0, offset = 4; ; 
      long sz = 0; 
      for (int i = 0; i < buf.Length; i++) 
      { 
       //Count the number value markers, first before the ftp markers and second 
       //the file size. 
       if (long.TryParse(buf[i], out sz)) numcnt++; 
       if (numcnt == 2) 
       { 
        //Get the attribute 
        string cbuf = "", dbuf = "", abuf = ""; 
        if (buf[0][0] == 'd') abuf = "Dir"; else abuf = "File"; 
        //Get the Date 
        if (!buf[i+3].Contains(':')) offset++; 
        for (int j = i + 1; j < i + offset; j++) 
        { 
         dbuf += buf[j]; 
         if (j < buf.Length - 1) dbuf += " "; 
        } 
        //Get the File/Dir name 
        for (int j = i + offset; j < buf.Length; j++) 
        { 
         cbuf += buf[j]; 
         if (j < buf.Length - 1) cbuf += " "; 
        } 
        //Store to a list. 
        _dirlist.Add(cbuf); 
        _attlist.Add(abuf); 
        _datelist.Add(dbuf); 
        _szlist.Add(sz); 

        offset = 0; 
        break; 
       } 
      } 
     }