2011-09-19 4 views
5

나는 FtpWebRequest로 놀고 있는데 어떻게 결과를 포맷 할 수 있을지 궁금해하고 있니?어떻게 파싱 하시겠습니까? 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(); 

는 내가 말할이 같은 결과는 다시

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

는 어떤 객체와 같은이 점을 구문 분석하는 좋은 방법이 될 것입니다 얻을 나는를 사용하는 경우는 확실하지

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

같은 long 또는 int 크기. 또한 datetime이 실제로 생성되었거나 수정 된 경우 무엇인지 확실하지 않습니다.

+1

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

답변

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

아 .... 희망이 도움이됩니다. 왜 그것이 저를 위해 작동하지 않는지 경이. 난 그냥했다 ''. 그것이 왜 분열되지 않았는지 궁금해하고있었습니다. 이것은 이것이 갈 수있는 최선의 방법인지 확신 할 수 없습니다.이 문제는 지속적으로 해결해야 할 필요가있는 것 같습니다 (다른 서비스로 이동할 경우 더 많은 필드가있을 수 있습니다) – chobo2

+0

@ chobo2, 항상 제 3자를 사용할 수 있습니다 구문 분석을 수행하고 모든 경우에 작동하는 컨트롤 (물론 * 모든 경우 *가 의미하는 것을 정의해야합니다). 필자는 표준 BCL 클래스를 사용하는 원시 예제만을 보여주었습니다. 물론이 특정 출력에서만 작동합니다. –

+0

그게 내가 지금 찾고있는거야. 나는 자유로운 것을 찾으려고 노력하고있다. 나는 거의 모두를 시험해 보았으나 돈을 지불하거나 디렉토리 목록을 가지고 있지 않다. – chobo2

1

FTP 표준에 대한 귀찮은 사실은 디렉토리 목록을 어떻게 포맷해야 하는지를 정확히 지정하지 않는다는 것입니다. 일반적으로 * nix 컴퓨터에서 반환 된 목록은 * nix 디렉토리 목록과 비슷하게 보이며 Windows에서 반환되는 목록은 DOS 목록과 비슷하지만 새로운 FTP 코드가 있으므로 IBM-4690과 AS400 물건, VMS, 오라클, 노벨 등등.

그래서 특정 서버 대신 일반적인 목적으로 만들려고한다면 다음과 같이 많은 파싱 작업을해야합니다. 물건을 살 시간이 가치가 있을지 모르지만 추천 사항이 없습니다.

0

이것은 ListDirectoryDetails를 구문 분석하기위한 내 알고리즘입니다. 나는 File/Dir 이름, Attribute, Created Date, Size를 List로 분리했다.

 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; 
       } 
      } 
     } 
관련 문제