r13-t.doc

(414 KB) Pobierz
Szablon dla tlumaczy

Rozdział 13.
Odczytywanie i zapisywanie plików na serwerze WWW

Odczyt i zapis plików jest niezwykle ważnym zagadnieniem ASP.NET. W poprzedniej części książki tworzyłeś już strony ASP.NET wykorzystujące pliki zewnętrzne (na przykład plik config.web, kod obsługi formularzy, pliki XML, itp.), jednak w tym rozdziale dowiesz się znacznie więcej o sposobie w jaki inne typy plików mogą powiększyć możliwości funkcjonalne aplikacji ASP.NET.

Istnieje bardzo wiele możliwości wykorzystania plików — bynajmniej nie ograniczają się one do przechowania danych zewnętrznych. W tym rozdziale omówione zostaną następujące zagadnienia:

·         Sposoby użycia plików w ASP.NET oraz gdzie pliki te będą widziane.

·         Sposoby dołączania plików do stron ASP.NET.

·         Sposoby dostępu do właściwości plików i folderów.

·         Sposoby otwierania, odczytu i zapisu informacji w plikach.

·         Sposoby dostarczania wydzielonych obszarów przechowywania danych dla każdego z użytkowników.

Wykorzystanie plików w ASP.NET

Dzięki środowisku .NET wykorzystanie plików zewnętrznych (czyli plików z rozszerzeniem inne niż .aspx) w ASP.NET jest bardzo łatwe. W rzeczywistości, pliki te są konieczne, by aplikacje ASP.NET działały poprawnie. Do takich niezbędnych plików można zaliczyć web.config oraz global.asax kontrolujące sposób działania aplikacji.

Pliki zewnętrzne można także wykorzystać do zwiększenia możliwości funkcjonalnych ASP.NET. Poznałeś już kilka takich plików, na przykład własne elementy sterujące oraz przestrzenie nazw kompilowane do postaci bibliotek DLL. Pliki te zwiększają możliwości funkcjonalne tworzonych aplikacji ASP.NET, a jednocześnie umożliwiają zachowanie prostoty kodu źródłowego stron ASP.NET.

APS.NET pozwala także na korzystanie z plików, które w ogóle nie stanowią części aplikacji lecz mogą się w niej przydać. Do plików tego typu można zaliczyć pliki zawierające informacje tekstowe, importowane pliki z nagłówkami informacyjnymi, pliki zawierające informacje o aplikacji, pliki z życiorysami, oraz wszelkie inne pliki, które w jakikolwiek sposób mogą się okazać przydatne. ASP.NET pozwala na dostęp i wykorzystanie całego systemu plików serwera, a zatem możliwości są ogromne.

Dołączanie zawartości plików zewnętrznych

Jednym ze sposobów wykorzystania plików w ASP.NET jest, tak zwane, dołączanie plików. Sposób ten przypomina pobranie zawartości jednego pliku i umieszczenie jej wewnątrz drugiego pliku; na szczęście jednak, programista nie musi tego robić samemu. Sposoby przedstawione w kilku kolejnych podrozdziałach pokazują różne metody dołączania plików dostępne w ASP.NET.

Server-Side Includes

Server-Sice Includes (dołączanie plików po stronie serwera, w skrócie SSI) jest sposobem oddzielania kodu od tworzonej strony. Metoda jest przydatna w sytuacjach gdy chcemy wielokrotnie używać wybranego fragmentu kodu, bądź uprościć edycję stron.

Składnia pozwalająca na dołączanie kodu tą metodą ma następującą postać:

<!--#include file="nazwaPliku"-->

 

lub

<!--#include virtual="nazwaPliku"-->

 

Słowo kluczowe virtual służy do określenia nazwy dołączanego pliku przy wykorzystaniu ścieżki wirtualnej, natomiast słowo kluczowe file umożliwia podanie ścieżki dostępu do pliku w lokalnej strukturze folderów. Na przykład, jeśli byś chciał dołączyć zawartość pliku o adresie http://twoj.serwer.com.pl/includes/plik1.aspx do strony ASP.NET o adresie http://twoj.serwer.com.pl/folder1/folder2/strona.aspx, mógłbyś w tym celu wykorzystać jedno z dwóch poniższych poleceń #include:

<!--#include file="../../includes/plik1.aspx"-->

 

lub

<!--#include virtual="/includes/plik1.aspx"-->

 

Zwróć uwagę, iż użyte polecenie #include file będzie miało różną postać w zależności do położenia strony, w której będzie umieszczana zawartość dołączanego pliku. Określenie pliku wykorzystywane w takim poleceniu nazywamy względną ścieżką dostępu do pliku. Używanie takich ścieżek może być denerwujące, zwłaszcza gdy strony wykorzystujące polecenie #include znajdują się w różnych folderach. Z tego właśnie powodu ASP.NET umożliwia także dołączanie plików na podstawie bezwzględnych ścieżek dostępu — służy do tego polecenie #include virtual przedstawione na drugim przykładzie. Umożliwia ono określenie położenia dołączanego pliku w sposób niezależny od położenia pliku, do którego zostanie on dołączony.

Umieśćmy zatem nagłówek w pliku, który będziemy mogli dołączyć do wielu różnych stron ASP.NET. W tym celu, w pierwszej kolejności należy stworzyć stronę ASP.NET o nazwie header.aspx i umieścić w niej następujący kod:

<a href="index.aspx"><img src="header.gif" alt="Strona główna"></a><hr>

<a href="index.aspx">Strona główna</a> <a href="logout.aspx">Wyjdź</a>

 

Nie należy umieszczać w tym pliku żadnych innych znaczników, jak na przykład elementy <form> — zostaną one umieszczone w kodzie strony, do której plik header.aspx będzie dołączany. Kolejną czynnością będzie stworzenie w tym samym folderze kolejnej strony ASP.NET i dołączenie do niej nagłówka:

<script language="VB" runat="server">

   sub Page_Load(obj as object, e as eventargs)

   end sub

</script>

 

<html><body>

  <!--#include file="header.aspx"-->

  Witamy!

</body></html>

 

ASP.NET wstawi zawartość pliku header.aspx zanim zostaną przetworzone jakiekolwiek polecenia ASP.NET. Z tego względu, gdy strona będzie już gotowa do wykonania, środowisko ASP.NET będzie uważało iż jej kod ma następującą postać:

<script language="VB" runat="server">

  sub Page_Load(obj as object, e as eventargs)

   end sub

</script>

 

<html><body>

<a href="index.aspx"><img src="header.gif" alt="Strona główna"></a><hr>

<a href="index.aspx">Strona główna</a> <a href="logout.aspx">Wyjdź</a>

  Witamy!

</body></html>

 

Postać strony, po wyświetleniu w przeglądarce, przedstawiłem na rysunku 13.1.

 

Rysunek 13.1.              Zawartość plików dołączanych po stronie serwera jest traktowana tak, jak gdyby stanowiła część wykonywanej strony ASP.NET

rysunek zamieszczony w oryginale książki ma się nijak do przykładu który ma ilustrować.

 

Notatka
Należy pamiętać, że wszystkie opisywane czynności są wykonywane na serwerze, zanim jakiekolwiek informacje zostaną przesłane do przeglądarki. Zawartość wszystkich plików jest łączona ze sobą na serwerze zanim zostanie wykonany jakikolwiek kod ASP.NET i zanim cokolwiek zostanie przesłane do klienta. Dzięki temu, wywołania metody Response.Redirect będą działać poprawnie.

Polecenia #include można umieszczać w dowolnych miejscach stron ASP.NET, oznacza to, iż przedstawiony w powyższym przykładzie nagłówek, równie dobrze mógłby być dołączony jako stopka. W dołączanym pliku można by także umieścić znaczniki <html> oraz <body>, jak również elementy sterujące wykonywane na serwerze.

Ostrzeżenie
Domyślnie polecenie #include można używać wyłącznie w plikach o rozszerzeniach .shtml, .shtm, .stm, .asp, .asa, .asax oraz .aspx. Polecenie to umieszczone w kodzie strony HTML nie zostanie przetworzone. Rozszerzenia plików obsługujących mechanizm Server-Side Includes można określać w Internet Services Managerze — programie zarządzającym serwerem IIS 5.0.

Server-Side Includes a inne sposoby dołączania plików

Możesz się zastanawiać nad różnicą pomiędzy technologią Server-Side Includes a elementami sterującymi tworzonymi przesz użytkowników. Oba te rozwiązania można wykorzystywać w tych samych celach — od wydzielania fragmentów interfejsu użytkownika. Różnica pomiędzy nimi polega na tym, iż elementy sterujące służą wyłącznie do tworzenia fragmentów interfejsu użytkownika, natomiast SSI można używać w różnych celach, między innymi do wydzielenia i zapisania w jednym miejscu często wykorzystywanych funkcji i stałych.

Zazwyczaj, w przypadku wydzielania elementu interfejsu użytkownika, lepiej jest posłużyć się elementem sterującym, gdyż można w nim wykorzystać elementy programistyczne; SSI nie daje tej możliwości.

 

Tak

Nie

SSI należy się posługiwać jeśli chcemy dołączać do tworzonych stron często wykorzystywane elementy programistyczne, takie jak klasy lub funkcje.

Nie należy używać SSI gdy chcemy dołączyć do strony wyłącznie element interfejsu użytkownika. W takim przypadku lepszym rozwiązaniem będzie wykorzystanie elementów sterujących tworzonych przez użytkownika.

Inne sposoby dołączania plików

Środowisko ASP.NET udostępnia także inne sposoby dołączania plików. Większość z nich została już przedstawiona we wcześniejszych częściach książki. Kod obsługi formularzy omówiłem w rozdziale 6, pt.: „Ciąg dalszy wiadomości na temat tworzenia formularzy internetowych”. Informacje na temat dyrektywy Import znajdziesz natomiast w rozdziale 2 — pt.: „Tworzenie stron ASP.NET”. I w końcu, w rozdziale 5. — pt.: „Podstawowe wiadomości o tworzeniu formularzy internetowych” — opisałem tworzenie elementów sterujących użytkownika.

Wszystkie te metody różnią się sposobem implementacji, lecz każda z nich zapewnia możliwość dołączania do stron ASP.NET zawartości innych plików.

Dostęp do plików

Przestrzeń nazw System.IO udostępnia wiele możliwości funkcjonalnych, z których można korzystać przy tworzeniu stron ASP.NET. Do możliwości tych należy zaliczyć odczytywanie i zapisywanie plików, tworzenie i usuwanie folderów oraz sprawdzanie atrybutów plików i folderów. Możliwości funkcjonalne udostępniane przez tę przestrzeń nazw pozwalają także na wykonywanie czynności w odpowiedzi na zdarzenia związane z systemem plików, takie jak stworzenie lub usunięcie folderu przez innego użytkownika.

Pliki, strumienie, czytelnicy i pisarze

Nim zaczniemy poznawać klasy dostępne w przestrzeni nazw System.IO oraz operować na plikach, należy przedstawić różnicę pomiędzy plikami i strumieniami. Zagadnienie to jest ważne, gdyż zarówno pliki jak i strumienie są w ASP.NET czymś zupełnie innym.

 

Nowe określenie

Z technicznego punktu widzenia plik jest kolekcją danych, której nadano nazwę i zapisano w unikalnym miejscu na dowolnie długi okres czasu. Na przykład, pliki przechowywane na dysku twardym Twojego komputera posiadają nazwę i ścieżkę dostępu, a możesz z nich korzystać w każdej chwili gdy tylko będziesz tego potrzebować. Możesz wyobrażać sobie plik jako pudełko zawierające różne rzeczy — realny obiekt.

 

Nowe określenie

Natomiast ze strumieniem nie jest skojarzona żadna nazwa pliku, ścieżka dostępu ani też miejsce przechowywania. Strumień może zostać wykorzystany do odczytania lub zapisu danych z dowolnego miejsca, na przykład pliku, sieci czy też pamięci. A zatem strumień jest sposobem zapewnienia dostępu do dowolnych informacji, w tym także do plików. Gdy otwierasz i odczytujesz zawartość pliku, w rzeczywistości jest przy tym wykorzystywany strumień. Dostępnych jest wiele różnych typów strumieni, lecz wszystkie one są klasami potomnymi klasy Stream.

Strumienie zapewniają binarny dostęp do danych — odczytują one nieprzetworzone informacje w formie zer i jedynek. Taki sposób dostępu do danych może być przydatny, lecz w ASP.NET bardziej interesuje nas korzystanie z informacji zapisanych w kodzie Unicede — czyli z łańcuchów znaków, a nie ciągów zer i jedynek.

Środowisko .NET udostępnia dwie klasy służące właśnie do tego celu — TextReader oraz TextWriter. Nie będę ich tu szczegółowo opisywał, jednak należy wiedzieć iż dziedziczy po nich wiele innych klas. Przykładami klas potomnych kas TextReader oraz TextWriterXmlTextReader oraz XmlTextWriter przedstawione w rozdziale 11., pt.: „Użycie XML w ASP.NET”; a w tym rozdziale poznasz kilka kolejnych.

A zatem dysponujemy już dwiema niezależnymi kategoriami klas — Stream oraz klasami potomnymi zapewniającymi dostęp do danych binarnych oraz TextReader i TextWriter (oraz ich klasami potomnymi) zapewniającymi dostęp do danych tekstowych. Poznając środowisko .NET bez żadnych trudności można określić do której z tych kategorii należy interesująca nas klasa. Klasy i obiekty dziedziczące po klasie Stream mają zazwyczaj w nazwie słowo „stream”; na przykład: FileStram, MemoryStram, itp. Z kolei klasy dziedziczące po klasach TextReader oraz TextWriter mają zazwyczaj w nazwach słowa „reader” lub „writer”; na przykład: XmlTextReader, XmlTextWriter, itd.

Na szczęście dostępne są także klasy umożliwiające konwersję danych binarnych na tekstowe. Dwie takie klasy — StreamReader oraz StreamWriter — niezwykle ważne dla operacji na plikach w ASP.NET, zostaną opisane w dalszej części tego rozdziału. Rysunek 13.2 ilustruje wzajemne zależności pomiędzy tymi wszystkimi klasami.

 

Rysunek 13.2.              Wzajemne relacje pomiędzy klasami Stream (i klasami potomnymi) oraz klasami TextReader i TextWriter (i ich klasami potomnymi)

Opis rysunku

Use these .NET object — Posłuż się następującymi obiektami .NET

To access… — Aby uzyskać dostęp do następujących źródeł danych

Memory — Pamięć

Networks — Sieci

Files — Pliki

Pozostałe (Stream, MemoryStream, TextReader…) bez zmian

 

Notatka
Nie należy mylić strumieni, czyli klasy Stream oraz jej klas potomnych, ze strumieniowaniem. Strumienie pozwalają na uzyskanie dostępu do miejsc w których przechowywane są informacje, natomiast strumieniowanie to metoda dynamicznego pobierania danych, kawałek po kawałku, gdy są potrzebne. Strumienie można porównać z rzeczownikiem, natomiast strumieniowanie z czasownikiem — strumienie mogą, choć nie muszą, być strumieniowane.

Nowe określenie

Klasa Stream pozwala na asynchroniczny dostęp do danych. Oznacza to, że podczas wykonywania operacji na plikach, jednocześnie mogą być realizowane inne czynności. Na przykład, w przypadku zapisu informacji do bardzo dużego pliku co prawdopodobnie będzie trwać dosyć długo, plik ten można otworzyć asynchronicznie i zapisywać w nim dane w tle, a jednocześnie wykonywać kod, który przekieruje użytkownika w inne miejsce witryny.

Przeciwieństwem dostępu asynchronicznego jest dostęp synchroniczny. W tym przypadku, aby wykonać kolejny fragment kodu, realizacja poprzedniego fragmentu musi się zakończyć. Wykorzystanie tego trybu dostępu do plików może doprowadzić do pogorszenia efektywności działania aplikacji. Różnice pomiędzy sposobem wykonywania operacji przy wykorzystaniu dostępu asynchronicznego i synchronicznego, zostały zilustrowane na rysunku 13.3. W tym rozdziale przedstawię wyłącznie synchronicznych dostęp do danych; więcej informacji na temat dostępu asynchronicznego znajdziesz w dokumentacji środowiska .NET.

 

Rysunek 13.3.              Asynchroniczny sposób wykonywania czynności często powoduje poprawienie efektywności działania aplikacji.

Opis rysunku

Time — Czas

Asynchronous — Dostęp asynchroniczny

Synchronous — Dostęp synchroniczny

General code — Wcześniejszy kod programu

Other operations — Inne czynności

File operations — Operacje na plikach

Continuing… — Kolejne czynności

 

Określanie właściwości plików i folderów

W tej części rozdziału skoncentrujemy się na czterech klasach: File i Directory oraz FileInfo oraz DirectoryInfo. Pierwsze dwie z nich udostępniają metody służące do tworzenia, modyfikacji oraz usuwania plików i folderów; a pozostałe — właściwości umożliwiające określanie atrybutów plików i folderów. Przykład wykorzystania obiektów tych klas przedstawiony został na listingu 13.1.

 

Listing 13.1.              Wyświetlanie informacji o plikach i folderach

1           <%@ Import Namespace="System.IO" %>

2           <script language="VB" runat="server">

3             

4              sub Page_Load(obj as object, e as eventargs)

5                 dim f as new FileInfo(Server.MapPath("listing1301.aspx"))

6            

7                 lblMessage.Text = "Informacje o pliku<br>" & _

8                    "<b>Nazwa: </b>" & f.Name & "<br>" & _

9                    "<b>Ścieżka: </b>" & f.DirectoryName & "<br>" & _

10                 "<b>Czas ostatniego dostępu: </b>" & f.LastAccessTime & _

11                    "<br>" & _

12                 "<b>Czas ostatniego zapisu: </b>" & f.LastWriteTime & _

13                    "<br>" & _

14                 "<b>Długość: </b>" & f.Length & " bajtów<p>"

15        ...

Zgłoś jeśli naruszono regulamin