|
ASP umożliwia dostęp do plików, katalogów oraz dysków poprzez obiekt FileSystemObject. Poprzez ten obiekt można tworzyć inne obiekty, tj. File, Folder lub Drive, które określają pliki, katalogi lub dyski komputera lokalnego. Obiekty FileSystemObject i File dostarczają metod i właściwości umożliwiających tworzenie obiektów TextStream, które określają pliki wejściowe i wyjściowe. Pliki tekstowe modą zastąpić bazę danych w przypadkach gdy będzie potrzeba przechowywania niewielkiej ilości danych.
Dostęp do pliku tekstowego
Obiekt TextSream dostarcza niezbędnych metod i właściwości umożliwiających odczytywanie i zapisywanie informacji do pliku tekstowego. Metody obiektu TextStream są następujące:
Read |
- |
odczytuje określoną ilość znaków z obiektu TextStream i zwraca ją w postaci łańcucha |
ReadLine |
- |
odczytuje całą linię z obiektu TextStream i zwraca ją w postaci łańcucha bez znaku końca linii |
ReadAll |
- |
odczytuje cały plik TextStream i w rezultacie go zwraca |
Write |
- |
zapisuje łańcuch do pliku TextStream |
WriteLine |
- |
zapisuje łańcuch do pliku TextStream i dodaje znak końca linii |
Close |
- |
zamyka obiekt TextStream |
zaś właściwości:
AtEndOfLine |
- |
zwraca wartość TRUE jeśli wskaźnik pliku TextStream znajduje się przed znakiem końca linii, a FALSE w przeciwnym wypadku |
AtEndOfStream |
- |
zwraca wartość TRUE jeśli wskaźnik pliku znajduje się na końcu pliku |
Column |
- |
zwraca wartość określającą bieżącą kolumnę, w której znajduje się wskaźnik pliku |
Line |
- |
zwraca wartość określającą bieżącą linię, w której znajduje się wskaźnik pliku |
Poniższy skrypt ASP demonstruje użycie podstawowych metod oraz właściwości obiektu TextStream. Skrypt otwiera plik C:plik.txt lub w przypadku, gdy nie istnieje, tworzy go. Następnie dodawany jest napis "To zostało napisane" oraz data tego wpisu, po czym plik jest zamykany. W dalszej części plik jest otwierany, odczytywana i wyświetlana jego zawartość, a następnie plik jest zamykany.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: |
<% @LANGUAGE = VBScript %> <% Option Explicit %> <% Const doOdczytu = 1, doZapisu = 2, doDopisu = 8 Const TristateUseDefault = -2 'Otwiera plik użuwając systemu domyślnego Const TristateTrue = -1 'Otwiera plik jako Unicode Const TristateFalse = 0 'Otwiera plik jako ASCII Dim objFS, objTextStream, strLine
' Dołączenie tekstu do pliku Set objFS = Server.CreateObject("Scripting.FileSystemObject") If objFS.FileExists("C:plik.txt") = True Then |
13: |
|
Set objTextStream = objFS.OpenTextFile("C:plik.txt", doDopisu, False, TristateFalse) |
14: |
Else |
15: |
|
Set objTextStream = objFS.CreateTextFile("C:plik.txt", False, False) |
16: 17: 18: 19: 20: 21: |
End If objTextStream.WriteLine "To zostało napisane " & Now & "." objTextStream.Close
' Odczytanie zawartości pliku Set objTextStream = objFS.OpenTextFile("C:plik.txt", doOdczytu, TristateFalse) |
22: 23: |
Response.Write "<P>Zawartość pliku jest następująca:</P>" & VbCrLf Do While objTextStream.AtEndOfStream <> True |
24: 25: 26: |
|
strLine = objTextStream.ReadLine strLine = Server.HTMLEncode(strLine) Response.Write strLine & "<BR>" & VbCrLf |
27: 28: 29: 30: 31: 32: |
Loop objTextStream.Close
Set objTextStream = Nothing Set objFS = Nothing %> |
W liniach 5-7 deklarowane są stałe obiektu FileSystemObject. W linii 8 znajduje się deklaracja zmiennych użytych w skrypcie. W linii 11 tworzony jest obiekt FileSystemObject i przechowywany w zmiennej objFS. W liniach 12-16 sprawdzane jest czy plik o podanej nazwie istnieje poprzez wywołanie metody FileExists. Otwierany jest plik C:plik.txt lub w przypadku gdy on nie istnieje, zostaje utworzony. Linia 13
Set objTextS = objFS.OpenTextFile("C:plik.txt", doDopisu, False, TristateFalse) |
otwiera plik C:plik.txt (pierwszy parametr) poprzez wywołanie metody OpenTextFile. Metoda posiada następujące parametry:
1. |
Nazwa_pliku |
- |
łańcuch zawierający nazwę otwieranego pliku |
2. |
Tryb_We/Wy |
- |
określa jakie operacje będą wykonywane na pliku, np. odczyt doOdczytu (1), dopisywanie doDopisu (8); parametr opcjonalny |
3. |
Utworzyć_jeśli_nie_istnieje |
- |
wartość boolowska określająca czy plik ma zostać utworzony w razie gdyby nie istniał; parametr opcjonalny |
4. |
Format |
- |
określa format otwartego pliku; wartość domyślna to plik ASCII; parametr opcjonalny |
Odnośnik do otwartego pliku jest przechowywany jako TextStream w zmiennej objTextStream (instrukcja Set). Komenda w linii 15 tworzy plik tekstowy C:plik.txt, jeśli taki nie istnieje. Parametry metody CreateTextFile są następujące:
1. |
Nazwa_pliku |
- |
łańcuch zawierający nazwę otwieranego pliku |
2. |
Nadpisać_jeśli_istnieje |
- |
wartość boolowska, określająca czy plik ma zostać nadpisany w razie gdyby istniał; wartość FALSE uniemożliwia metodzie nadpisanie pliku; parametr opcjonalny |
3. |
Plik_Unicode |
- |
wartość boolowska, określająca czy plik ma zostać utworzony jako plik unicode; parametr opcjonalny |
Linie 12-16 można zastąpić pojedynczą linią, wyglądającą następująco:
Set objTextStream = objFS.OpenTextFile("C:plik.txt", doDopisu, True, TristateFalse) |
Powyższa instrukcja automatycznie tworzy plik C:plik.txt przed jego otwarciem, jeśli taki jeszcze nie istnieje (trzeci parametr). W linii 17 do pliku dopisywany jest tekst zakończony przejściem do następnej linii (metoda WriteLine). Treść tekstu jest następująca: "To zostało napisane" oraz data pobrana w momencie dopisywania tego tekstu. Instrukcja w linii 18 zamyka obiekt TextStream, gdyż wywołana została metoda Close obiektu. W następnej części skryptu, czyli w liniach 20-28, następuje otwarcie istniejącego już pliku (utworzonego w pierwszej części skryptu) i wyświetlenie jego zawartości. W linii 21 plik C:plik.txt został otwarty, wywołana została metoda OpenTextFile, w trybie do odczytu (drugi parametr - doOdczytu) oraz jako plik ASCII (parametr trzeci - TristateFalse). Zawartość pliku jest wysłana do przeglądarki (klienta) w linii 23-27. Warunek w pętli Do While dotyczy określenia końca pliku. Jeśli wystąpi informacja o końcu pliku, wartość właściwości AtEndOfStream będzie równa wartości TRUE i pętla zakończy swoje wykonywanie. W linii 24 zostaje odczytana pojedyncza linia znajdująca się w pliku i zapisana w zmiennej strLine. W linii 25 zawartość zmiennej strLine jest przetwarzana na tekst HTML i w linii 27 wyświetlana w oknie przeglądarki. Po zakończeniu wykonywania się pętli Do While, obiekt TextStream został zamknięty (linia 28) i zasoby serwera dotyczące obiektów objTextStream oraz objFS zostały zwolnione w liniach 30-31.
Odczytanie właściwości dysku
W celu pobrania informacji o dysku należy posłużyć się obiektem Drive, który zawiera w swoich właściwościach informacje na temat wszystkich zamontowanych na serwerze napędów dyskowych. Obiekt posiada 11 właściwości i nie posiada żadnej metody. Poniżej przedstawiony skrypt ASP odczytuje wszystkie właściwości napędu, na którym sam się znajduje i wyświetla je w oknie przeglądarki.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: |
<% @LANGUAGE = VBScript %> <% Option Explicit %> <% Const doOdczytu = 1, doZapisu = 2, doDopisu = 8 Const TristateUseDefault = -2 'Otwiera plik używając domyślnych ustawień Const TristateTrue = -1 'Otwiera plik jako Unicode Const TristateFalse = 0 'Otwiera plik jako ASCII Dim objFS, strFile, strDriveName, objDrive Dim strDriveType, R
Set objFS = Server.CreateObject("Scripting.FileSystemObject") strFile = Request.ServerVariables("SCRIPT_NAME") strFile = Server.MapPath(strFile) strDriveName = objFS.GetDriveName(strFile) Set objDrive = objFS.GetDrive(strDriveName)
R = "Właściwości napędu " & strDriveName & "<BR>" R = R & "Nazwa napędu = " & objDrive.DriveLetter & "<BR>" R = R & "Ścieżka = " & objDrive.Path & "<BR>" R = R & "System plików = " & objDrive.FileSystem & "<BR>" R = R & "Nazwa wolumenu = " & objDrive.VolumeName & "<BR>" R = R & "Wolne miejsce = " & FormatNumber(objDrive.FreeSpace/1024, 0) & " KB<BR>" |
23: |
R = R & "Pojemność = " & FormatNumber(objDrive.TotalSize/1024, 0) & " KB<BR>" |
24: 25: 26: 27: 28: |
R = R & "Katalog główny = " & objDrive.RootFolder & "<BR>" R = R & "Numer seryjny = " & objDrive.SerialNumber & "<BR>" R = R & "Nazwa udziału = " & objDrive.ShareName & "<BR>"
If objDrive.IsReady = True Then |
29: |
|
R = R & "Stan dostępu = gotowy" & "<BR>" |
30: |
Else |
31: |
|
R = R & "Stan dostępu = brak gotości" & "<BR>" |
32: 33: |
End If Select Case objDrive.DriveType |
34: 35: 36: 37: 38: 39: |
|
Case 0: strDriveType = "Nieznany" Case 1: strDriveType = "Wymienialny" Case 2: strDriveType = "Stały" Case 3: strDriveType = "Sieciowy" Case 4: strDriveType = "CD-ROM" Case 5: strDriveType = "Dysk RAM" |
40: 41: 42: 43: 44: 45: 46: 47: |
End Select R = R & "Typ napędu = " & strDriveType & "<BR>"
Response.Write R
Set objDrive = Nothing Set objFS = Nothing %> |
W liniach 4-7 zostały zdefiniowane stałe użyte w skrypcie, zaś deklaracja zmiennych w liniach 8-9. W linii 11 został stworzony obiekt FileSystemObject, niezbędny w celu utworzenia obiektu Drive. W linii 12 zmiennej strFile została przypisana wartość zmiennej środowiskowej SCRIPT_NAME. Od tej pory zmienna strFile zawiera wirtualną ścieżkę do bieżącego skryptu. W linii 13 następuje odczytanie fizycznej ścieżki przez wykorzystanie zmiennej strFile oraz metody MapPath. W linii 14 nazwa dysku, na którym znajduje się skrypt, jest przypisana do zmiennej strDriveName za pomocą metody GetDriveName obiektu FileSystemObject. Obiekt Drive jest utworzony w linii 15 przez wywołanie metody GetDrive obiektu FileSystemObject i przechowywany w zmiennej objDrive. W liniach 17-41 następuje zapisanie wszystkich informacji dotyczących bieżącego dysku (obiektu Drive) do zmiennej R w postaci łańcucha. Każda właściwość obiektu Drive została omówiona już w skrypcie więc nie ma potrzeby do tego wracać. Linia 43 wysyła do przeglądarki (klienta) zawartość zmiennej R. W liniach 45-46 następuje zwolnienie zasobów serwera przeznaczonych dla obiektów objDrive oraz objFS.
Wykonywanie operacji na katalogach
W celu dokonywania jakichkolwiek operacji na katalogach należ posłużyć się obiektem Folder. Za pomocą jego metod można przenosić, kopiować oraz kasować katalogi. Można także utworzyć plik tekstowy używając metody CreateTextFile obiektu Folder. Poniższy skrypt wyświetla fizyczną strukturę katalogu głównego WWW wraz z wszystkimi podkatalogami i plikami.
1: 2: 3: 4: 5: 6: 7: |
<% @LANGUAGE = VBScript %> <% Option Explicit %> <HTML> <BODY> <P>Struktura katalogu:</P> <% Function Akapit(glebokosc) |
8: 9: |
|
Dim i, wyjscie For i = 1 To glebokosc |
10: |
|
|
wyjscie = wyjscie & " " |
11: 12: |
|
Next Akapit = wyjscie |
13: 14: 15: |
End Function
Function SprawdzKatalogi(ByRef objKatalog, ByVal glebokosc) |
16: 17: 18: 19: |
|
Dim Katalog, Plik, i i = Akapit(glebokosc - 1) Response.Write i & "<B>" & objKatalog.Name & "</B><BR>" For Each Katalog In objKatalog.SubFolders |
20: |
|
|
SprawdzKatalogi Katalog, glebokosc + 1 |
21: 22: 23: |
|
Next i = Akapit(glebokosc) For Each Plik In objKatalog.Files |
24: |
|
|
Response.Write i & Plik.Name & "<BR>" |
25: |
|
Next |
26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: |
End Function
' Początek programu głównego Dim objFS, objRootFolder, strVirtualRoot
strVirtualRoot = Server.MapPath("/") Set objFS = Server.CreateObject("Scripting.FileSystemObject") Set objRootFolder = objFS.GetFolder(strVirtualRoot)
SprawdzKatalogi objRootFolder, 1
Set objRootFolder = Nothing Set objFS = Nothing %> </BODY> </HTML> |
Powyższy skrypt zawiera dwie funkcje (linie 7-26) oraz część główną skryptu (28-38). W części głównej znajduje się deklaracja zmiennych (linia 29) oraz tworzone są obiekty FileSystemObject i Folder. Wywołanie funkcji SprawdzKatalogi z parametrami znajduje się w linii 35. Wywołanie funkcji z parametrami może przyjąć także postać:
SprawdzKatalogi(objRootFolder, 1) |
Funkcja za chwilę będzie omawiana. Ostatni fragment części głównej zwalnia zasoby serwera zajmowane przez obiekty objRootFolder i objFS.
Funkcja Akapit(glebokosc) zwraca łańcuch z pozycją (odstępem obrazującym wizualnie lokalizację) pliku lub katalogu. Parametrem wejściowym jest glebokosc, który zawiera pozycję (głębokość) pliku lub katalogu. Przypisanie wartości zwrotnej funkcji znajduje się w linii 12. Instrukcja informująca o końcu funkcji znajduje się w linii 13.
Funkcja SprawdzKatalogi(ByRef objKatalog, ByVal glebokosc) pełni rolę procedury, gdyż nie zwraca wartości. W pierwszej części, linia 16 to deklaracja zmiennych wewnętrznych funkcji, tj. Katalog, Plik oraz i. W linii 17 następuje przyporządkowanie łańcucha zwróconego przez funkcję Akapit zmiennej i (parametrem wejściowym jest pozycja bieżącego katalogu zmniejszona o jeden), która jest wysyłana wraz z nazwą bieżącego katalogu do przeglądarki (klienta) w linii 18. Pętla For Each znajdująca się w liniach 19-21 w przypadku wystąpienia podkatalogów w katalogu bieżącym wywołuje się ona sama, z tą różnicą, że jej parametrami są teraz:
- |
bieżący podkatalog, |
- |
pozycja (głębokość) zwiększona o jeden bieżącego katalogu. |
W dalszej części, linia 22, zmiennej i przypisywana jest wartość łańcucha zwróconego przez funkcję Akapit z parametrem wejściowym równym poziomowi (głębokości) bieżącego katalogu. W liniach 23-25 znajduje się kolejna pętla For Each, która wyświetla nazwy wszystkich plików znajdujących się w bieżącym katalogu. Linia 24 informuje o zakończeniu funkcji SprawdzKatalogi. Funkcja SprawdzKatalogi jest funkcją rekurencyjną i jej działanie jest trochę złożone. Poniższa funkcja (PokazBiezacyKatalog) mogłaby zastąpić funkcję SprawdzKatalogi w przypadku, gdyby należało wyświetlić informacje tylko na temat bieżącego katalogu, bez wglądu w strukturę wewnętrzną podkatalogów. Funkcja PokazBiezacyKatalog nie posiada parametru wejściowego określającego poziom (głębokość) umieszczonych plików oraz podkatalogów, nie jest funkcją rekurencyjną, gdyż nie wywołuje się sama z kodu wewnętrznego.
1: |
Function PokazBiezacyKatalog(ByRef objKatalog) |
2: 3: 4: 5: |
|
Dim Katalog, Plik, i i = " " Response.Write "<B>" & objKatalog.Name & "</B><BR>" For Each Katalog In objKatalog.SubFolders |
6: |
|
|
Response.Write i & "<B>" & Katalog.Name & "</B><BR>" |
7: 8: |
|
Next For Each Plik In objKatalog.Files |
9: |
|
|
Response.Write i & Plik.Name & "<BR>" |
10: |
|
Next |
11: |
End Function |
Przenoszenie, kopiowanie i kasowanie plików i katalogów
Obiekt FileSystemObject dostarcza metod umożliwiających przenoszenie, kopiowanie oraz kasowanie plików i folderów. Oto one:
Copy |
- |
kopiuje określony plik lub katalog z jednego miejsca na drugie |
Delete |
- |
usuwa określony plik lub katalog |
Move |
- |
przenosi określony plik lub katalog z jednego miejsca na drugie |
OpenAsTextStream |
- |
tworzy określony plik i zwraca obiekt TextStream, który może być użyty w celu odczytu i zapisu do pliku (metoda nie jest dostępna dla obiektu File) | | |