2011-09-19 10 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;} 
} 

कुछ सुनिश्चित नहीं हैं कि अगर मैं एक का उपयोग करना चाहिए आकार के लिए लंबा या int। मुझे यह भी यकीन नहीं है कि डेटाटाइम वास्तव में क्या बनाया गया है, या संशोधित या जो भी हो।

+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, आप हमेशा किसी तृतीय पक्ष का उपयोग कर सकते हैं पार्सिंग करने के लिए नियंत्रण और जो सभी मामलों में काम करेगा (निश्चित रूप से आपको परिभाषित करना होगा कि * सभी मामलों * का मतलब क्या है)। मैंने केवल मानक बीसीएल कक्षाओं का उपयोग करके एक कच्चा उदाहरण दिखाया है जो निश्चित रूप से केवल इस विशिष्ट आउटपुट के लिए काम करेगा। –

+0

हां यही वह है जो मैं अभी देख रहा हूं। मैं एक मुफ्त खोजने की कोशिश कर रहा हूँ। मैंने लगभग सभी को नुजेट पर करने की कोशिश की लेकिन वे या तो भुगतान कर रहे हैं या निर्देशिका नहीं है फाइलसाइजिंग के साथ – chobo2

1

एफ़टीपी मानक के बारे में एक कष्टप्रद बात यह है कि यह निर्दिष्ट नहीं करता है कि निर्देशिका सूची को कैसे प्रारूपित किया जाना चाहिए। आम तौर पर, * निक्स मशीनों से लौटाई गई लिस्टिंग * निक्स निर्देशिका सूची की तरह दिखती हैं और विंडोज़ से लौटे गए लोग अक्सर डॉस सूची की तरह दिखते हैं लेकिन आपके पास पुराने उत्पादों का आधार बनाने वाला पुराना एफ़टीपी कोड है, इसलिए आईबीएम -46 9 0 है और AS400 सामान, वीएमएस, ओरेकल, नोवेल और इतने पर।

तो यदि आप एक विशिष्ट सर्वर के बजाय कुछ सामान्य उद्देश्य बनाने की कोशिश कर रहे हैं तो आपको बहुत बदसूरत पार्सिंग काम मिल गया है। कुछ खरीदने के लिए आपका समय लायक हो सकता है लेकिन मेरे पास कोई सिफारिश नहीं है।

0

यह ListDirectoryDests को पार्स करने के लिए मेरा एल्गोरिदम है। मैंने फाइल/डिअर नाम, विशेषता, दिनांक बनाया, और आकार सूची में अलग किया। आशा है कि इस मदद करता है ....

 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; 
       } 
      } 
     } 
संबंधित मुद्दे