2011-09-19 26 views
5

Tôi đang chơi xung quanh với FtpWebRequest và tôi tự hỏi làm thế nào tôi có thể định dạng kết quả?Cách phân tích cú pháp này? 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(); 

tôi nhận được kết quả như thế này lại

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

Điều gì sẽ là một cách tốt để phân tích này vào như một đối tượng nói điều gì đó như

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

Không chắc chắn nếu tôi nên sử dụng một dài hoặc int cho kích thước. Tôi cũng không chắc chắn về thời gian thực sự là gì nếu nó được tạo, hoặc sửa đổi hay bất cứ điều gì.

+1

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

Trả lời

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. Không có thắc mắc tại sao nó không làm việc cho tôi. Tôi vừa làm ''. Đã tự hỏi tại sao nó không bị chia tách. Bạn không chắc chắn đây có phải là cách tốt nhất để mặc dù đây có phải là thứ cần phải liên tục cố định hay không (như thể tôi chuyển nó sang dịch vụ khác họ có thể có nhiều trường hơn) – chobo2

+0

@ chobo2, bạn luôn có thể sử dụng bên thứ ba kiểm soát để làm phân tích cú pháp và sẽ làm việc trong mọi trường hợp (tất nhiên, bạn sẽ phải xác định những gì * tất cả các trường hợp * có nghĩa là). Tôi đã chỉ cho thấy một ví dụ thô bằng cách sử dụng các lớp BCL tiêu chuẩn mà tất nhiên sẽ chỉ làm việc cho đầu ra cụ thể này. –

+0

Ya đó là những gì tôi đang tìm kiếm bây giờ. Tôi đang cố gắng tìm một cái miễn phí. Tôi đã thử gần như tất cả trên nuget nhưng họ hoặc là trả tiền hoặc không có directoryListing với filesizes – chobo2

1

Điều khó chịu về tiêu chuẩn FTP là nó không chỉ định chính xác cách định dạng danh sách thư mục. Nói chung, các danh sách được trả về từ các máy * nix trông giống như danh sách thư mục * nix và những cái được trả về từ Windows thường trông giống như danh sách DOS, nhưng bạn đã có mã FTP cũ tạo thành cơ sở của các sản phẩm mới hơn, do đó có IBM-4690 và AS400 công cụ, VMS, Oracle, Novell và như vậy.

Vì vậy, nếu bạn đang cố gắng để làm một cái gì đó chung mục đích thay vì cho một máy chủ cụ thể thì bạn đã có rất nhiều công việc phân tích cú pháp xấu xí để làm. Nó có thể là giá trị thời gian của bạn để mua một cái gì đó nhưng tôi không có bất kỳ khuyến nghị.

0

Đây là thuật toán của tôi để phân tích cú pháp ListDirectoryDetails. Tôi đã tách tên File/Dir, Attribute, Date Created và Size thành List. Hy vọng điều này sẽ giúp ....

 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; 
       } 
      } 
     } 
Các vấn đề liên quan