2014-12-07 2 views
0

나는 재귀 적 메서드를 만들려고하는데,이 메서드는 ftp 디렉터리 목록을 treeView에 복사합니다.
나는 그걸하려고 애썼지 만, &은 더럽고 더러움은 &으로 단순합니다.

여기 내 코드 조각을 볼 수 있습니다 : 당신이 볼 수 있듯이
FTP를 가져 오는 재귀 적 메서드 directoryList

public void connectToServer(string pServerIP, string pServerPort, string pUsername, string pPassword) 
    { 
     _serverIP = pServerIP; 
     _serverPort = pServerPort; 
     _username = pUsername; 
     _password = pPassword; 

     string ftpServerPath = "ftp://" + pServerIP + ":" + pServerPort + "/"; 
     try 
     { 
      FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpServerPath); 
      request.Method = WebRequestMethods.Ftp.ListDirectory; 
      request.Credentials = new NetworkCredential(pUsername, pPassword); 
      FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
      Stream responseStream = response.GetResponseStream(); 
      StreamReader reader = new StreamReader(responseStream); 

      secondLevelDirectotyList = new List<string>(); 

      int i = 0; 
      TreeNode rootTreeNode = tVDirectories.Nodes.Add("/"); 
      Console.WriteLine("/\n"); 
      while (!reader.EndOfStream) 
      { 
       secondLevelDirectotyList.Add(reader.ReadLine()); 
       Console.WriteLine("...: " + secondLevelDirectotyList[i]); 
       i++; 
      } 

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

      getFTPDirectoryList(secondLevelDirectotyList, 0); 
     } 
     catch (WebException ex) 
     { 
      MessageBox.Show("The following Exceptions occurs:\n" + ex.Message, "Exception occurs", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

    private void getFTPDirectoryList(List<string> pTopLevelDirectoryList, int pDirectoryListIndexer)//string pFTPPath) 
    { 
     //List<string> 
     string ftpServerPath = "ftp://" + _serverIP + ":" + _serverPort + "/" + pTopLevelDirectoryList[pDirectoryListIndexer];//pFTPPath; 
     try 
     { 
      FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpServerPath); 
      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); 

      thirdLevelDirectoryList = new List<string>(); 

      int i = 0; 
      TreeNode ftpServerDirectory = tVDirectories.Nodes[0].Nodes.Add(pTopLevelDirectoryList[pDirectoryListIndexer]);//pFTPPath); 
      while (!reader.EndOfStream) 
      { 
       string streamFTPPath = reader.ReadLine(); //Ließt die Zeile des Streams aus 
       thirdLevelDirectoryList.Add(streamFTPPath); //Fügt den gesamten Pfad in die String-Liste 
       Console.WriteLine("...........: " + thirdLevelDirectoryList[i]); 

       string newTreeNode = streamFTPPath.Substring(streamFTPPath.IndexOf(@"/") + 1); 
       ftpServerDirectory.Nodes.Add(newTreeNode); //Fügt nur den Unterordner- oder Unterdatei-Namen in die Ansicht ein 
       i++; 
      } 

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

      //rekursiv 
      pDirectoryListIndexer++; 
      try 
      {      
       getFTPDirectoryList(pTopLevelDirectoryList, pDirectoryListIndexer); 
      } 
      catch (ArgumentOutOfRangeException ex) 
      { 
       // start next level Directory List 
       //pDirectoryListIndexer = 0; 
       //getFTPDirectoryList(thirdLevelDirectoryList, 0); 
      } 
     } 
     catch (WebException ex) 
     { 
      MessageBox.Show("The following Exceptions occurs:\n" + ex.Message, "Exception occurs", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

, 나는 포인트가 FTP 폴더를 탐색하지 않습니다.
여러분은 또한 내가 처음으로 ftp-protocol로 작업한다는 것을 알 수 있습니다.
예 : ftp-ListDirectory-Command를 보낼 때마다 요청을 열어야하는지 여부를 모르겠습니다.

나는 이런 식으로 뭔가 싶어 :
루트/
을 ... 폴더 1
...... file1infolder1
... 파일 2
... Folder2 폴더
...... file3infolder2

나는 당신이 나를 이해할 수 있기를 바랍니다. D
그리고 나는 또한 나의 나쁜 영어로 슬프다.

+0

나는 그것을 얻었다. 나는 내일 해결책을 게시 하겠지만, 재귀적인 GetFTPDirectoryList-method는 효율적이지 않다. 서버 나 NAS의 모든 파일을 검사하는 데 오랜 시간이 걸린다. 그래서 나는 그것을 바꿀 것이다. 나는 그것을 해결하는 가장 좋은 방법은 사용자가 그것을 클릭하면 폴더를 확인하는 것입니다 생각합니다. – Ismoh

답변

0

이있는 FTP 경로에서 모든 파일 및 폴더 목록을 재귀 방법에 대한 내 솔루션,
하지만
unefficient이며 사용이 불가능하다 !!!! 당신이 다섯 개 폴더가있는 경우
,이 방법은 작동하지만 당신이 ~ 오 개 폴더에 이상이있는 경우 방법은 끝나지 않을 것이다 -이 .. 언젠가 끝날 것이라는 점을 확실이 글을 읽을

그래서 모든 사람을위한, :
FTP 디렉토리를 나열하는 재귀 적 방법을 사용하는 아이디어를 생각해보십시오!
사용자가 폴더를 "열면"NLIST-ftp-command를 보내야합니다.

private void FtpNlistRecursive(string pPath) 
    { 
     try 
     { 
      DirectoryListOfCurrent = new List<string>(); 
      _ftpServerFullPath = "ftp://" + _serverIP + ":" + _serverPort + "/" + pPath; 
      string newItem = ""; 

      FtpWebRequest request = (FtpWebRequest)WebRequest.Create(_ftpServerFullPath); 
      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); 

      while (!reader.EndOfStream) 
      { 
       newItem = reader.ReadLine(); 
       string shortItem = pPath.Substring(pPath.IndexOf(@"/") + 1); // Aus "Ornder1/Datei1.txt" wird "Datei1.txt" 
       if (!shortItem.Equals(newItem)) 
       { 
        try 
        { 
         if (pPath.Equals("/")) 
         { 
          DirectoryListOfCurrent.Add(newItem); 
          directoryListOfAll.Add(newItem); 
         } 
         else 
         { 
          string completePath = pPath + newItem.Substring(newItem.IndexOf(@"/")); 
          DirectoryListOfCurrent.Add(completePath); 
          directoryListOfAll.Add(completePath); 
         } 
        } 
        catch (ArgumentOutOfRangeException ex) 
        { 
         //bei ZB "Datei3.txt" gibt es kein "/", somit einfach ignorieren 
        } 

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

      foreach (string item in DirectoryListOfCurrent) 
      { 
       FtpNlistRecursive(item); 
      } 
     } 
     catch (Exception ex) 
     { 
      ExceptionOccurs(ex); 
     } 
    }