Wątki

[ Pobierz całość w formacie PDF ]
.KeepAlive = false;using (FtpWebResponse response =(FtpWebResponse)request.GetResponse()){Stream stream = response.GetResponseStream();using(StreamReader reader = new StreamReader(stream)){string directory;while ((directory = reader.ReadLine()) != null){directories.Add(directory);}}}return directories; Rozdział 5.f& Aplikacje TCP i UDP 117}catch{throw new Exception("Błąd: Nie można nawiązać połączenia z " +host);}}Przyjrzyjmy się tej metodzie.Z racji tego, że używanie wskazników w C# jestniedozwolone, nie możemy zbudować tablicy dynamicznej.Posłużymy siękolekcją ArrayList z przestrzeni nazw System.Collections.Będzie ona zawieraćlistę plików i katalogów.Dalej, podobnie jak w poprzednich przykładach z tegorozdziału, korzystamy z mechanizmu żądanie-odpowiedz.Właściwa metoda,dzięki której możemy uzyskać szczegółową listę katalogów i plików, znajduje sięw klasie WebRequestMethods.Ftp i nosi nazwę ListDirectoryDetails.Istniejerównież metoda zwracająca same nazwy plików i katalogów.Jest toListDirectoryDetails.Wygodniej jest jednak używać tej pierwszej funkcji,ponieważ będziemy mogli w łatwy sposób rozróżnić pliki i katalogi.Kolejnymkrokiem jest uwierzytelnienie użytkownika na serwerze FTP.Korzystającz pól username i password, ustawiamy własność Credentials utworzonegożądania.Nie chcemy utrzymywać aktywnego połączenia, więc zmiennąKeepAlive ustawimy na false.Nasza aplikacja będzie działać w czterechkrokach: połączenie, wysłanie żądania, odczytanie odpowiedzi, zamknięciepołączenia.Na komentarz zasługują kolejne linie programu, gdzie używamysłowa kluczowego using, które do tej pory stosowaliśmy do definiowaniaprzestrzeni nazw.Tutaj konstrukcja, w której po słowie using następujedeklaracja instancji klasy, powoduje, że tak utworzony obiekt zostanie usuniętyz pamięci po przekroczeniu zakresu.Innymi słowy, obiekt ten  żyje wyłączniew nawiasach klamrowych (por.projekt 26.).W ten sposób tworzona jestinstancja klasy FtpWebResponse.Przy jej budowaniu korzystamy z metodyGetResponse instancji klasy FtpWebRequest.Całość jest rzutowana naFtpWebResponse.Kolejny krok to utworzenie strumienia (instancji klasy Stream),który będzie reprezentował odpowiedz serwera FTP.Pamiętajmy, że działamytutaj w warstwie aplikacji modelu DoD.Używając tego strumienia, tworzymyinstancję klasy StreamReader o nazwie reader.Czytając z referencji readerlinia po linii, tworzymy odpowiedz, którą następnie zwracamy.Całość znajdujesię w bloku ochronnym try/catch.Jeżeli z jakichś powodów nie możemynawiązać połączenia, wówczas generujemy wyjątek, który powiadomi głównąaplikację o błędzie.Wyjątki są standardową metodą komunikacji pomiędzyklasami, komponentami i kontrolkami.2.Aby sprawdzić działanie naszej funkcji, musimy jej użyć w aplikacji.Przenosimy się więc do widoku kodu pliku FormMain.cs.3.W kodzie klasy FormMain deklarujemy nowe prywatne pole:private FtpClient client = new FtpClient();4.Potrzebna nam jest funkcja, dzięki której wartość zwróconą z metodyGetDirectories będziemy mogli umieścić w kontrolce listBoxFtpDir.Listing 5.62 zawiera kod tej funkcji.Do projektu FormMain musimyjeszcze dodać przestrzeń nazw System.Collections. 118 C#.Tworzenie aplikacji sieciowych.Gotowe projektyListing 5.62.Funkcja wypisująca listę plików i katalogów w kontrolce listBoxFtpDirprivate void GetFtpContent(ArrayList directoriesList){listBoxFtpDir.Items.Clear();listBoxFtpDir.Items.Add("[.]");directoriesList.Sort();foreach (string name in directoriesList){string position = name.Substring(name.LastIndexOf(' ') + 1,name.Length - name.LastIndexOf(' ') - 1);if (position != "." && position !=".")switch (name[0]){case 'd':listBoxFtpDir.Items.Add("[" + position + "]");break;case 'l':listBoxFtpDir.Items.Add("->" + position);break;default:listBoxFtpDir.Items.Add(position);break;}}}Argumentem tej funkcji jest szczegółowa lista plików i katalogów.Przykładowywpis z listy plików i katalogów może wyglądać następująco: drwxrwxrwx 9root ftpadmin 4096 Apr 25 01:34 pub.Pierwszy znak mówi nam,czy mamy do czynienia z katalogiem (litera d), plikiem (znak -) bądz linkiem(litera l).Kolejne pozycje to nazwa właściciela, grupa, wielkość pliku (jeżelijest to katalog, wówczas mamy liczbę 4096), data i czas utworzenia oraz, jakoostatnia, nazwa katalogu lub pliku.W pętli foreach dla każdej pozycji z tablicydirectoriesList sprawdzana jest pierwsza litera.Jeżeli jest to katalog,umieszczamy jego nazwę (zmienna pozycja) w nawiasach prostokątnych,plik pozostawiamy bez zmian, natomiast link oznaczamy ->.Na początkulisty katalogów wstawiamy znak [.], co oznacza przeniesienie w góręo jeden katalog.Większość serwerów na zapytanie o listę plików i katalogówodpowiada podobnie, jednak nie ma tu jakiegoś wyraznego standardu.Możesię zdarzyć, że do listy katalogów dodawane będą wpisy.lub &.Funkcja tadziałała poprawnie dla większości serwerów FTP.5.Mając funkcję GetFtpContent, możemy oprogramować przycisk Połącz.Dla domyślnej metody zdarzeniowej kontrolki buttonConnect piszemy kodz listingu 5.63.Listing 5.63.Metoda ustanawiająca połączenie i listująca zawartość katalogu FTPprivate void buttonConnect_Click(object sender, EventArgs e){if (comboBoxServer.Text != string.Empty & comboBoxServer.Text.Trim() !=String.Empty)try Rozdział 5.f& Aplikacje TCP i UDP 119{string serverName = comboBoxServer.Text;//nazwa hosta nie może zaczynać się od ftp://if (serverName.StartsWith("ftp://"))serverName = serverName.Replace("ftp://","");client = new FtpClient(serverName, textBoxLogin.Text,maskedTextBoxPass.Text);GetFtpContent(client.GetDirectories());textBoxFtpPath.Text = client.FtpDirectory;toolStripStatusLabelServer.Text = "Serwer: ftp://" + client.Host;buttonConnect.Enabled = false;buttonDisconnect.Enabled = true;buttonDownload.Enabled = true;buttonUpload [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • mikr.xlx.pl
  • Powered by MyScript