2011-09-19 12 views
5

Używam FtpWebRequest i zastanawiam się, w jaki sposób sformatować wynik?Jak to przeanalizować? 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(); 

uzyskać wyniki podobne do tego z powrotem

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

Jaki byłby dobry sposób, aby analizować to pod jak przedmiot powiedzieć coś

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

Nie jestem pewien, czy powinienem użyć długi lub int dla rozmiaru. Nie jestem również pewien, co to jest datetime, jeśli jest ona tworzona, modyfikowana lub cokolwiek innego.

+1

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

Odpowiedz

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. Nic dziwnego, dlaczego nie zadziałało to dla mnie. Właśnie zrobiłem ''. Zastanawiał się, dlaczego nie dzielił się. Nie jestem pewien, czy to jest najlepszy sposób na kontynuowanie, ponieważ wydaje się, że jest to coś, co będzie wymagało stałego poprawiania (tak jakbym przeniósł to do innej usługi, może mieć więcej pól) – chobo2

+0

@ chobo2, zawsze możesz użyć strony trzeciej kontrola do parsowania i która będzie działać we wszystkich przypadkach (gdzie oczywiście będziesz musiał zdefiniować, co * wszystkie przypadki * oznaczają). Pokazałem prosty przykład używając standardowych klas BCL, które oczywiście będą działać tylko dla tego konkretnego wyjścia. –

+0

Tak właśnie tego teraz szukam. Próbuję znaleźć bezpłatną. Próbowałem prawie wszystkie na nuget, ale są one albo zapłacić lub nie mają DirectoryListing z filesizes – chobo2

1

Jedną z denerwujących cech standardu FTP jest to, że nie określa dokładnie, w jaki sposób powinien być sformatowany listing katalogu. Ogólnie rzecz biorąc, listy zwrócone z * nix-owych maszyn wyglądają bardziej jak * listy katalogów nix, a te zwracane z Windows często wyglądają bardzo podobnie do listy DOS, ale masz stary kod FTP stanowiący podstawę nowszych produktów, więc istnieje IBM-4690 i AS400, VMS, Oracle, Novell i inne.

Więc jeśli próbujesz zrobić coś ogólnego, a nie konkretnego serwera, masz do wykonania wiele brzydkich zadań. Być może warto poświęcić czas na zakup czegoś, ale nie mam żadnych zaleceń.

0

To jest mój algorytm do analizowania ListDirectoryDetails. Oddzieliłem nazwę pliku/katalogu, atrybut, datę utworzenia i rozmiar na listę. Nadzieję, że to pomaga ....

 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; 
       } 
      } 
     } 
Powiązane problemy