2011-09-19 25 views
5

FtpWebRequest ile oynuyorum ve sonucu nasıl biçimlendirebilirim?Nasıl ayrıştırılır? 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(); 

diyorum böyle sonuçları geri

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

Ne bir nesne gibi içine bu ayrıştırmak için iyi bir yol olacağını olsun ben kullanmak gerektiğinden emin değilim

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

gibi bir şey boyut için uzun veya int. Ayrıca, datetime'nin gerçekte oluşturulduğu, değiştirildiği ya da her neyse, ne olduğundan emin değilim.

+1

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

cevap

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 .... bu yardımcı olur umarım. Merak etme neden benim için işe yaramadı. Az önce yaptım ''. Neden ayrılmadığını merak ediyordum. Bu en iyi yol olup olmadığından emin değil, çünkü bu sürekli olarak sabitlenmesi gereken bir şey gibi görünüyor (başka bir hizmete taşıyabiliyormuşum gibi daha fazla alana sahip olabilirler) – chobo2

+0

@ chobo2, her zaman bir üçüncü taraf kullanabilirdiniz ayrıştırma yapmak için kontrol ve her durumda çalışacaktır (elbette, tüm vakaların * ne anlama geldiğini tanımlamanız gerekir). Sadece bu spesifik çıktı için çalışacak standart BCL sınıflarını kullanarak sadece kaba bir örnek gösterdim. –

+0

Ya şimdi aradığım şey bu. Özgür birini bulmaya çalışıyorum. Neredeyse her yerde nuget denedim ama ya ödeme yapıyorlar ya da dizini bulunmuyor – chobo2

1

FTP standardı hakkında can sıkıcı bir şey, dizin listesinin nasıl biçimlendirilmesi gerektiğini tam olarak belirtmemesidir. Genelde, * nix makinelerinden dönen listeler * nix dizin listelerine benziyor ve Windows'dan dönenler genellikle bir DOS listesi gibi görünüyor, ancak yeni ürünlerin tabanını oluşturan eski bir FTP kodunuz var, yani IBM-4690 ve AS400 şeyler, VMS, Oracle, Novell ve benzeri.

Belirli bir sunucu yerine genel bir amaç yapmaya çalışıyorsanız, yapmak için çok fazla çirkin ayrıştırma işine sahipsiniz. Bir şey satın almak için zaman ayırmaya değer olabilir ama hiçbir tavsiyem yok.

0

Bu, ListDirectoryDetails ayrıştırma algoritmamdır. Dosya/Dir adı, Öznitelik, Oluşturma Tarihi ve Boyutu Listeye ayırdım.

 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; 
       } 
      } 
     } 
İlgili konular