2010-12-15 12 views
15

मैं System.Net.FtpWebRequest वर्ग का उपयोग कर रहा है और मेरे कोड इस प्रकार है:प्राप्त कर रहा है निर्माण तिथि (एफ़टीपी)

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://example.com/folder"); 
request.Method = WebRequestMethods.Ftp.ListDirectory; 

request.Credentials = new NetworkCredential("username", "password"); 

FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

Stream responseStream = response.GetResponseStream(); 
StreamReader reader = new StreamReader(responseStream); 

string names = reader.ReadToEnd(); 

reader.Close(); 
response.Close(); 

यह MSDN पर दिए गए उदाहरणों पर ही आधारित होता है, लेकिन मैं कुछ भी अधिक नहीं मिल सका विस्तृत।

मैं names में फ़ोल्डर में सभी फ़ाइल नाम संग्रहीत कर रहा हूं लेकिन अब मैं उनमें से प्रत्येक के माध्यम से कैसे पुन: प्रयास कर सकता हूं और उनकी तिथियां पुनर्प्राप्त कर सकता हूं? मैं तिथियों को पुनः प्राप्त करना चाहता हूं ताकि मैं नवीनतम फाइलें पा सकूं। धन्यवाद।

+0

मैं काफी यकीन है कि एफटीपी केवल समर्थन हासिल है कर रहा हूँ संशोधित तिथियों के लिए, निर्माण की तारीख नहीं। – Nyerguds

उत्तर

14

WebRequestMethods.Ftp.ListDirectory एक FTP निर्देशिका में सभी फ़ाइलों का "लघु सूची" देता है। इस प्रकार की लिस्टिंग केवल फाइल नाम प्रदान करने जा रही है - फ़ाइल पर अतिरिक्त विवरण नहीं (जैसे अनुमतियां या अंतिम संशोधित दिनांक)।

इसके बजाय WebRequestMethods.Ftp.ListDirectoryDetails का उपयोग करें। यह विधि FTP सर्वर पर फ़ाइलों की एक लंबी सूची लौटाएगी। एक बार जब आप इस सूची को names चर में पुनर्प्राप्त कर लेते हैं, तो आप लाइन वर्ण के अंत के आधार पर names चर को सरणी में विभाजित कर सकते हैं। इसके परिणामस्वरूप प्रत्येक सरणी तत्व फ़ाइल (या निर्देशिका) नाम सूची होगी जिसमें अनुमतियां, अंतिम संशोधित दिनांक स्वामी इत्यादि शामिल हैं ...

इस बिंदु पर, आप इस सरणी पर फिर से सक्रिय कर सकते हैं, अंतिम संशोधित दिनांक की जांच करें प्रत्येक फ़ाइल के लिए, और फ़ाइल को डाउनलोड करना है या नहीं।

मुझे उम्मीद है कि इससे मदद मिलती है !!

+2

सिद्धांत में काम करता है लेकिन एफ़टीपी सर्वर से प्रतिक्रिया चीजों को महत्वपूर्ण रूप से जटिल करती है। – Radu

+1

यदि आप सर्वर से प्राप्त प्रतिक्रिया साझा कर सकते हैं - शायद मैं कुछ भविष्य सहायता प्रदान कर सकता हूं। मेरा जवाब जानबूझकर थोड़ा सा सामान्य था क्योंकि सर्वर से वास्तविक प्रतिक्रिया सर्वर से सर्वर में भिन्न होने जा रही है। – pmartin

+1

बस स्पष्ट करने के लिए, यह * संशोधित * तारीख * बनाई गई * तारीख नहीं है, जिसे पूछा गया था, है ना? –

-1

सबसे पहले आपको फ़ाइल नाम डेलीमीटर पर String.Split का उपयोग करके नामों को तोड़ने की आवश्यकता होगी। फिर सभी तारों के माध्यम से पुनरावृत्त करें और निर्देशिकाओं को नेविगेट करें

+0

कमांड सूची निर्देशिका फाइलों के बारे में कोई विवरण नहीं देती है, विभाजन करने के लिए कुछ भी नहीं है। – brablc

25

यह http://msdn.microsoft.com/en-us/library/system.net.ftpwebresponse.lastmodified(v=VS.90).aspx

FtpWebRequest request = (FtpWebRequest)WebRequest.Create (serverUri); 
request.Method = WebRequestMethods.Ftp.GetDateTimestamp; 
FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
Console.WriteLine ("{0} {1}",serverUri,response.LastModified); 
+2

यह स्पष्ट करने के लिए यह – d512

+2

करने का यह सही तरीका है, यह * संशोधित * दिनांक * बनाई गई * तारीख नहीं है, जिसे पूछा गया था, है ना? –

14

दुर्भाग्य से ठीक से काम करने लगता है, वहाँ .NET फ़्रेमवर्क द्वारा की पेशकश की सुविधाओं का उपयोग कर timestamps को पुनः प्राप्त करने के लिए कोई वास्तव में विश्वसनीय और कारगर तरीका है, के रूप में यह एफ़टीपी MLSD आदेश का समर्थन नहीं करता। MLSD कमांड एक मानक मशीन-पठनीय प्रारूप में दूरस्थ निर्देशिका की एक सूची प्रदान करता है। आदेश और प्रारूप को RFC 3659 द्वारा मानकीकृत किया गया है।

विकल्प आप उपयोग कर सकते हैं, जो .NET ढांचे द्वारा समर्थित हैं:

  • ListDirectoryDetails विधि (एफ़टीपी LIST आदेश) एक निर्देशिका में सभी फ़ाइलों के विवरण प्राप्त करने के लिए और फिर आप FTP सर्वर विशिष्ट प्रारूप के साथ सौदा विवरण (* ls * के समान निक्स प्रारूप * निक्स कमांड सबसे आम है, एक दोष यह है कि प्रारूप समय के साथ बदल सकता है, क्योंकि नई फाइलों के लिए "8 मई 17:48" प्रारूप का उपयोग किया जाता है और पुरानी फाइलों के लिए "अक्टूबर 18 200 9 "प्रारूप का उपयोग किया जाता है)।

    DOS/Windows के प्रारूप: C# class to parse WebRequestMethods.Ftp.ListDirectoryDetails FTP response
    * nix प्रारूप: Parsing FtpWebRequest ListDirectoryDetails line

  • GetDateTimestamp विधि (एफ़टीपी MDTM आदेश) को व्यक्तिगत रूप से प्रत्येक फ़ाइल के लिए टाइम स्टांप पुनः प्राप्त करने के। एक फायदा यह है कि प्रतिक्रिया RFC 3659 से YYYYMMDDHHMMSS[.sss] द्वारा मानकीकृत है। एक नुकसान यह है कि आपको प्रत्येक फ़ाइल के लिए एक अलग अनुरोध भेजना होगा, जो काफी अक्षम हो सकता है।

    const string uri = "ftp://example.com/remote/path/file.txt"; 
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri); 
    request.Method = WebRequestMethods.Ftp.GetDateTimestamp; 
    FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
    Console.WriteLine("{0} {1}", uri, response.LastModified); 
    

वैकल्पिक रूप से आप एक 3 पार्टी एफ़टीपी ग्राहक कार्यान्वयन आधुनिक MLSD आदेश का समर्थन करता है कि उपयोग कर सकते हैं।

उदाहरण के लिए WinSCP .NET assembly इसका समर्थन करता है।

आपके विशिष्ट कार्य के लिए भी एक उदाहरण है: Downloading the most recent file
उदाहरण PowerShell और SFTP के लिए है, लेकिन सी # और आसानी से एफ़टीपी के लिए अनुवाद:

// Setup session options 
SessionOptions sessionOptions = new SessionOptions 
{ 
    Protocol = Protocol.Ftp, 
    HostName = "example.com", 
    UserName = "username", 
    Password = "password", 
}; 

using (Session session = new Session()) 
{ 
    // Connect 
    session.Open(sessionOptions); 

    // Get list of files in the directory 
    string remotePath = "/remote/path/"; 
    RemoteDirectoryInfo directoryInfo = session.ListDirectory(remotePath); 

    // Select the most recent file 
    RemoteFileInfo latest = 
     directoryInfo.Files 
      .OrderByDescending(file => file.LastWriteTime) 
      .First(); 

    // Download the selected file 
    string localPath = @"C:\local\path\"; 
    string sourcePath = RemotePath.EscapeFileMask(remotePath + latest.Name); 
    session.GetFiles(sourcePath, localPath).Check(); 
} 

(मैं WinSCP के लेखक हूँ)

+2

यह जवाब होना चाहिए। धन्यवाद। –

संबंधित मुद्दे