2010-05-04 6 views
25

एफ़टीपी के माध्यम से किसी दिए गए निर्देशिका की जांच करने का सबसे अच्छा तरीका खोज रहे हैं।यह जांचने के लिए कि कोई एफ़टीपी निर्देशिका मौजूद है

private bool FtpDirectoryExists(string directory, string username, string password) 
{ 

    try 
    { 
     var request = (FtpWebRequest)WebRequest.Create(directory); 
     request.Credentials = new NetworkCredential(username, password); 
     request.Method = WebRequestMethods.Ftp.GetDateTimestamp; 

     FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
    } 
    catch (WebException ex) 
    { 
     FtpWebResponse response = (FtpWebResponse)ex.Response; 
     if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable) 
      return false; 
     else 
      return true; 
    } 
    return true; 
} 

इस झूठे रिटर्न कि क्या निर्देशिका वहाँ है या नहीं:

वर्तमान में मैं निम्नलिखित कोड है। क्या कोई मुझे सही दिशा दिखा सकता है।

+0

यह जांचने के लिए एक डीआईआर बनाने की अनुशंसा नहीं की जाती है कि यह मौजूद है या नहीं। यदि सर्वर कमांड का समर्थन करता है (जैसे FileZilla) तो मैं एमएलएसटी का उपयोग करने की सलाह दूंगा; यदि नहीं, तो आप सीडब्ल्यूडी का उपयोग कर सकते हैं, और फिर LIST कमांड का उपयोग कर सकते हैं। मुझे यह संसाधन मिला जो मुझे लगता है कि यह ऐसा कर सकता है: [यह निर्धारित करना कि कोई निर्देशिका मौजूद है या नहीं) (http://www.componentpro.com/doc/ftp/Determining-whether-a-directory-exists2.htm) –

उत्तर

15

मूल रूप से ऐसी त्रुटि को फंस गया जो मुझे निर्देशिका बनाने के दौरान प्राप्त होता है।

private bool CreateFTPDirectory(string directory) { 

    try 
    { 
     //create the directory 
     FtpWebRequest requestDir = (FtpWebRequest)FtpWebRequest.Create(new Uri(directory)); 
     requestDir.Method = WebRequestMethods.Ftp.MakeDirectory; 
     requestDir.Credentials = new NetworkCredential("username", "password"); 
     requestDir.UsePassive = true; 
     requestDir.UseBinary = true; 
     requestDir.KeepAlive = false; 
     FtpWebResponse response = (FtpWebResponse)requestDir.GetResponse(); 
     Stream ftpStream = response.GetResponseStream(); 

     ftpStream.Close(); 
     response.Close(); 

     return true; 
    } 
    catch (WebException ex) 
    { 
     FtpWebResponse response = (FtpWebResponse)ex.Response; 
     if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable) 
     { 
      response.Close(); 
      return true; 
     } 
     else 
     { 
      response.Close(); 
      return false; 
     } 
    } 
} 
+12

है यह कोड अविश्वसनीय है: उदाहरण के लिए यदि आपने अधिकार नहीं लिखे हैं और कोई वांछित निर्देशिका नहीं है तो यह फ़ंक्शन सत्य हो जाएगा। –

+0

FtpWebResponse की स्थिति डिस्क्रिप्शन संपत्ति की जांच करने का विकल्प भी है। यदि इसमें 'मौजूद' है (550 निर्देशिका पहले से मौजूद है) तो यह पहले से मौजूद है। ** कैसे ** मुझे कोई विशिष्टता या आश्वासन नहीं मिला है कि सभी एफ़टीपी सर्वरों को इसे वापस करना होगा, यह सिर्फ फाइलज़िला के मामले में हो सकता है। तो इसे अपने कण परिदृश्य में जांचें और फैसला करें कि यह ऐसा कुछ है जिसे आप करना चाहते हैं/जोखिम। –

0

मूल निर्देशिका पर नेविगेट करें, "ls" कमांड निष्पादित करें, और परिणाम को पार्स करें।

+0

क्या मुझे मिल सकता है एक उदाहरण? –

-5

इसके लायक होने के लिए, यदि आप EnterpriseDT's FTP घटक का उपयोग करते हैं तो आप अपने एफ़टीपी जीवन को थोड़ा आसान बना देंगे। यह मुफ़्त है और आपको सिरदर्द बचाएगा क्योंकि यह आदेशों और प्रतिक्रियाओं से संबंधित है। आप बस एक अच्छी, सरल वस्तु के साथ काम करते हैं।

+1

डाउनवॉटेड क्योंकि यह मुफ्त नहीं है और क्योंकि यह जावा एपीआई –

0

मैं काम करने के लिए इस @BillyLogans सुझाव

मैंने पाया समस्या डिफ़ॉल्ट एफ़टीपी निर्देशिका था/थी नहीं मिल सका .... घर/usr/फ्रेड

जब मैं प्रयोग किया है:

String directory = "ftp://some.domain.com/mydirectory" 
FtpWebRequest requestDir = (FtpWebRequest)FtpWebRequest.Create(new Uri(directory)); 

मैं इस

"ftp:/some.domain.com/home/usr/fred/mydirectory" 
में बदल जाता है पाया 10

इस परिवर्तन निर्देशिका उरी को रोकने के लिए:

String directory = "ftp://some.domain.com//mydirectory" 

फिर इस काम करना शुरू।

6

मैं इस तर्ज पर कुछ कोशिश करेंगे:

  • MLST < निर्देशिका > एफ़टीपी कमान (RFC3659 में परिभाषित) भेजें और यह उत्पादन है पार्स। इसे मौजूदा निर्देशिकाओं के लिए निर्देशिका विवरण के साथ वैध रेखा वापस करनी चाहिए।

  • यदि एमएलएसटी कमांड उपलब्ध नहीं है, तो सीडब्ल्यूडी कमांड का उपयोग करके कार्यरत निर्देशिका में कार्यशील निर्देशिका को बदलने का प्रयास करें। वापस जाने में सक्षम होने के लिए एक परीक्षण निर्देशिका में बदलने से पहले वर्तमान पथ (पीडब्ल्यूडी कमांड) निर्धारित करना न भूलें।

  • एमडीटीएम और SIZE कमांड के कुछ सर्वर संयोजन पर समान उद्देश्य के लिए उपयोग किया जा सकता है, लेकिन व्यवहार काफी जटिल है और इस पोस्ट के दायरे से बाहर है।

यह मूलतः हमारे Rebex FTP component करता है के वर्तमान संस्करण में क्या DirectoryExists तरीका है। निम्नलिखित कोड दिखाता है कि इसका उपयोग कैसे करें:

string path = "/path/to/directory"; 

Rebex.Net.Ftp ftp = new Rebex.Net.Ftp(); 
ftp.Connect("hostname"); 
ftp.Login("username","password"); 

Console.WriteLine(
    "Directory '{0}' exists: {1}", 
    path, 
    ftp.DirectoryExists(path) 
); 

ftp.Disconnect(); 
+2

हालांकि अन्य उत्तर कोड प्रदान करते हैं, लेकिन वे अनिवार्य रूप से एक नई निर्देशिका बना रहे हैं यह देखने के लिए कि कोई त्रुटि उत्पन्न होती है या नहीं। एफ़टीपी 'सीडब्ल्यूडी' कमांड को बस जारी करने के लिए बहुत बेहतर है, यदि निर्देशिका मौजूद नहीं है तो सर्वर 5xx उत्तर कोड जारी करेगा। – timbo

+0

"सीडब्ल्यूडी" कमांड के लिए धन्यवाद। –

4

उपयोगकर्ता यह कोड आपका उत्तर हो सकता है ..

public bool FtpDirectoryExists(string directoryPath, string ftpUser, string ftpPassword) 
     { 
      bool IsExists = true; 
      try 
      { 
       FtpWebRequest request = (FtpWebRequest)WebRequest.Create(directoryPath); 
       request.Credentials = new NetworkCredential(ftpUser, ftpPassword); 
       request.Method = WebRequestMethods.Ftp.PrintWorkingDirectory; 

       FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
      } 
      catch (WebException ex) 
      { 
       IsExists = false; 
      } 
      return IsExists; 
     } 

मैं के रूप में इस विधि कहा जाता है:

bool result = FtpActions.Default.FtpDirectoryExists(@"ftp://mydomain.com/abcdir", txtUsername.Text, txtPassword.Text); 

क्यों एक और पुस्तकालय का उपयोग करें - अपने खुद के तर्क के पैदा करते हैं।

+11

यह केवल सीडब्ल्यूडी (वर्तमान कार्य निर्देशिका) वापस कर देगा। कोई होस्टर जो आप होस्ट पते में जोड़ते हैं (उदा: ftp://mydomain.com) यह हमेशा मौजूदा निर्देशिका को दूसरे शब्दों को वापस कर देगा IExists कभी भी सत्य नहीं होगा। यदि यह एकमात्र चीज है जो मैं करता हूं (ऊपर) तो मेरे सर्वर पर यह केवल "257"/'वर्तमान निर्देशिका है। "। "257"/abcdir/'वर्तमान निर्देशिका नहीं है। " जैसे सभी उम्मीद करेंगे। –

2

मैंने ठोस जांच पाने के लिए हर तरह से प्रयास किया लेकिन न तो WebRequestMethods.Ftp.PrintWorkingDirectory और न ही WebRequestMethods.Ftp.ListDirectory विधियां सही तरीके से काम करेंगी। वे ftp://<website>/Logs की जांच करते समय विफल रहे जो सर्वर पर मौजूद नहीं है लेकिन वे कहते हैं कि यह करता है।

तो जिस विधि के साथ मैं आया था वह फ़ोल्डर में अपलोड करने का प्रयास करना था। हालांकि, एक 'पकड़ लिया' पथ प्रारूप है जो आप इस थ्रेड Uploading to Linux

यहाँ में के बारे में पढ़ सकते हैं है एक कोड स्निपेट

private bool DirectoryExists(string d) 
{ 
    bool exists = true; 
    try 
    { 
     string file = "directoryexists.test"; 
     string path = url + homepath + d + "/" + file; 
     //eg ftp://website//home/directory1/directoryexists.test 
     //Note the double space before the home is not a mistake 

     //Try to save to the directory 
     req = (FtpWebRequest)WebRequest.Create(path); 
     req.ConnectionGroupName = "conngroup1"; 
     req.Method = WebRequestMethods.Ftp.UploadFile; 
     if (nc != null) req.Credentials = nc; 
     if (cbSSL.Checked) req.EnableSsl = true; 
     req.Timeout = 10000; 

     byte[] fileContents = System.Text.Encoding.Unicode.GetBytes("SAFE TO DELETE"); 
     req.ContentLength = fileContents.Length; 

     Stream s = req.GetRequestStream(); 
     s.Write(fileContents, 0, fileContents.Length); 
     s.Close(); 

     //Delete file if successful 
     req = (FtpWebRequest)WebRequest.Create(path); 
     req.ConnectionGroupName = "conngroup1"; 
     req.Method = WebRequestMethods.Ftp.DeleteFile; 
     if (nc != null) req.Credentials = nc; 
     if (cbSSL.Checked) req.EnableSsl = true; 
     req.Timeout = 10000; 

     res = (FtpWebResponse)req.GetResponse(); 
     res.Close(); 
    } 
    catch (WebException ex) 
    { 
     exists = false; 
    } 
    return exists; 
} 
7

मुझे लगता है कि आप पहले से ही FtpWebRequest साथ कुछ हद तक परिचित हैं, के रूप में यह है .NET में FTP एक्सेस करने का सामान्य तरीका।

आप निर्देशिका को सूचीबद्ध करने और त्रुटि स्थिति को जांचने का प्रयास कर सकते हैं।

try 
{ 
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.microsoft.com/12345"); 
    request.Method = WebRequestMethods.Ftp.ListDirectory; 
    using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) 
    { 
     // Okay. 
    } 
} 
catch (WebException ex) 
{ 
    if (ex.Response != null) 
    { 
     FtpWebResponse response = (FtpWebResponse)ex.Response; 
     if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable) 
     { 
      // Directory not found. 
     } 
    } 
} 
+0

मुझे यह अविश्वसनीय लगता है। मेरे पास एक ऐसा मामला है जहां निर्दिष्ट निर्देशिका मौजूद नहीं होने पर कोई अपवाद नहीं फेंक दिया जाता है। –

7

मैं भी इसी तरह की समस्या से फंस गया था। मैं उपयोग कर रहा था,

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftpserver.com/rootdir/test_if_exist_directory"); 
request.Method = WebRequestMethods.Ftp.ListDirectory; 
FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

और निर्देशिका मौजूद नहीं होने पर अपवाद के लिए इंतजार कर रहा था। इस विधि ने अपवाद फेंक दिया नहीं।

कुछ हिट और परीक्षणों के बाद, मैंने निर्देशिका को "ftp://ftpserver.com/rootdir/test_if_exist_directory" से बदल दिया: "ftp://ftpserver.com/rootdir/test_if_exist_directory/"। अब यह टुकड़ा मेरे लिए काम कर रहा है।

मुझे लगता है कि हमें यह काम प्राप्त करने के लिए FTP फ़ोल्डर के यूरी में बैकस्लैश (/) जोड़ना चाहिए।

के रूप में अनुरोध किया है, पूर्ण समाधान अब हो जाएगा:

public bool DoesFtpDirectoryExist(string dirPath) 
{ 
    try 
    { 
     FtpWebRequest request = (FtpWebRequest)WebRequest.Create(dirPath); 
     request.Method = WebRequestMethods.Ftp.ListDirectory; 
     FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
     return true; 
    } 
    catch(WebException ex) 
    { 
     return false; 
    } 
} 

//Calling the method: 
string ftpDirectory = "ftp://ftpserver.com/rootdir/test_if_exist_directory/"; //Note: backslash at the last position of the path. 
bool dirExists = DoesFtpDirectoryExist(ftpDirectory); 
+0

यदि आपका कोई समस्या आपकी समस्या का समाधान नहीं करता है तो अपना खुद का प्रश्न खोलें। यह भी ध्यान दें कि ओपी में 4 से अधिक वर्षों का समय है। – gmo

+0

कृपया अपने स्वयं के समाधान का प्रयास करें और परिणाम पोस्ट करें – Deepend

+1

@gmo: इस टिप ने पूरी तरह से मेरी समस्या का समाधान किया। कोड का यह टुकड़ा संचालन में अच्छा प्रदर्शन कर रहा है। – Bikash

-2

एक ही तरीका है जो मेरे लिए काम किया है, तो वह पहले से मौजूद निर्देशिका/पथ (जो एक अपवाद फेंक होगा बनाने के लिए कोशिश कर रहा द्वारा एक उल्टा तर्क था) और यदि ऐसा है तो इसे बाद में हटा दें। अन्यथा ध्वज मेआंग सेट करने के लिए अपवाद का उपयोग करें कि निर्देशिका/पथ मौजूद है। मैं काफी VB.NET के लिए नया हूँ और मैं वहाँ एक अच्छा यह कोड करने के लिए रास्ता नहीं है shure कर रहा हूँ - लेकिन वैसे भी यहां मेरे कोड है:

 Public Function DirectoryExists(directory As String) As Boolean 
     ' Reversed Logic to check if a Directory exists on FTP-Server by creating the Directory/Path 
     ' which will throw an exception if the Directory already exists. Otherwise create and delete the Directory 

     ' Adjust Paths 
     Dim path As String 
     If directory.Contains("/") Then 
      path = AdjustDir(directory)  'ensure that path starts with a slash 
     Else 
      path = directory 
     End If 

     ' Set URI (formatted as ftp://host.xxx/path) 

     Dim URI As String = Me.Hostname & path 

     Dim response As FtpWebResponse 

     Dim DirExists As Boolean = False 
     Try 
      Dim request As FtpWebRequest = DirectCast(WebRequest.Create(URI), FtpWebRequest) 
      request.Credentials = Me.GetCredentials 
      'Create Directory - if it exists WebException will be thrown 
      request.Method = WebRequestMethods.Ftp.MakeDirectory 

      'Delete Directory again - if above request did not throw an exception 
      response = DirectCast(request.GetResponse(), FtpWebResponse) 
      request = DirectCast(WebRequest.Create(URI), FtpWebRequest) 
      request.Credentials = Me.GetCredentials 
      request.Method = WebRequestMethods.Ftp.RemoveDirectory 
      response = DirectCast(request.GetResponse(), FtpWebResponse) 
      DirExists = False 

     Catch ex As WebException 
      DirExists = True 
     End Try 
     Return DirExists 

    End Function 

WebRequestMethods.Ftp.MakeDirectory और WebRequestMethods.Ftp.RemoveDirectory तरीके हैं मैं इसके लिए इस्तेमाल किया। अन्य सभी समाधान मेरे लिए काम नहीं करते थे।

उम्मीद है कि यह