Учебная работа. Статья: Представление в Internet содержимого каталога средствами ASP
Христофоров Юрий
В данной статье я на примере расскажу, как используя ASP (Active Server Pages) можно выстроить содержимое каталога Web аналогично тому, как это смотрится на FTP сервере.
Постановка задачки: На Web-сервере есть каталог, к примеру: C:InetPubwwwrootUser1. Пусть данный каталог имеет несколько вложенных каталогов и набор файлов в этих каталогах. Примерная структура папок представлена на Рис. 1.
Рис. 1.
В любом из представленных на рисунке каталогах может находиться неограниченное количество файлов, или некие из каталогов могут быть пустыми. нужно представить содержимое папки user1 на Web-странице в дружеском для юзера виде.
Увлекательной индивидуальностью скрипта будет то, что применяя страничку с фреймами (кадрами), можно выстроить меню юзера.
Итог должен смотреться приблизительно последующим образом:
Находимся в папке C:InetpubwwwrootUser1folder1subfolder2:
На данном снимке экрана показан пример меню. Страничка menu.htm разбита на два фрейма. В левом фрейме находится файл list_files.asp, а правый фрейм употребляется для отображения файлов, ссылки на которые находятся в левом фрейме. В левом фрейме можно свободно передвигаться по папкам. Т.о. можно организовать меню юзера.
Решение: Ключ к решению данной задачки — это внедрение MicrosoftR Scripting Library. Нас будет заинтересовывать таковой объект данной библиотеки, как FileSystemObject. FileSystemObject предоставляет объектную модель доступа к файловой системе. Дальше, пользуясь средствами языка написания сценариев VBScript, выполняемого на Web-сервере, можно написать одну ASP-страницу, которая будет делать всю работу. Итак, приступим.
Листинг файла list_files.asp:
<%Response.Expires=0%> ‘Отключаем кэширование странички
<HTML>
<BODY>
<!-Серверныйсценарий
<%
Dim root_folder, root_vfolder, curr_dir, curr_dir2, temp_arr
‘root_folder — переменная для хранения физического пути к корневой папке User1
root_folder = «c:inetpubwwwrootUser1″
‘root_vfolder — переменная для хранения виртуального пути к папке User1
‘localhost — имя Вашего сервера
root_vfolder = «HTTP://localhost/user1″
‘curr_dir2 — имя текущей (активной) папки
curr_dir2 = Request.QueryString(«dir») ‘Имяполучаемиз URL
‘curr_dir — полный физический путь к текущей папке. Выходит конкатенацией строк, ‘содержащихся в переменных root_folder и curr_dir2.
curr_dir = root_folder & curr_dir2
‘temp_arr — временный массив
‘Получаем массив, содержащий наименования каталогов текущей папки.
temp_arr = ShowDirList(curr_dir)
‘Сортируеммассивстрок
temp_arr = SortStr(temp_arr)
%>
<table border=0>
<%
‘Вызов процедуры, осуществляющей вывод заглавий подкаталогов текущего каталога.
Call Main_Print(temp_arr,1)
‘Получаем массив, содержащий названия файлов текущей папки.
temp_arr = ShowFilesList(curr_dir)
‘Сортируеммассивстрок
temp_arr = SortStr(temp_arr)
‘Вызов процедуры, осуществляющей вывод названий файлов текущего каталога.
Call Main_Print(temp_arr,0)
%>
</table>
<%
‘Чистка содержимого массива
Erase temp_arr
Дальше следует текст функций и процедур, применяемых в сценарии.
Функции: ShowFilesList — возвращает массив, содержащий названия файлов текущей папки.
ShowDirList — возвращает массив, содержащий наименования каталогов текущей папки.
SortStr — сортирует массив строк.
Процедура: Main_Print — производит вывод в html-формате содержимое текущего каталога.
Продолжение листинга файла list_files.asp:
Function ShowFilesList(folder)
Dim fs, f, f1, fc, i
‘Определяем динамический массив для хранения названий файлов
ReDim farr(0)
‘СоздаемобъектFileSystemObject
Set fs = CreateObject(«Scripting.FileSystemObject»)
Set f = fs.GetFolder(folder)
Set fc = f.Files
i=0
‘В цикле заполняем массив названиями файлов текущей папки
For Each f1 In fc
farr(i) = LCase(CStr(f1.Name)) ‘Преобразуем имя к нижнему регистру знаков
i = i + 1
‘Увеличениеразмерамассива
ReDim Preserve farr(i)
Next
‘Возвращаемрезультат
ShowFilesList = farr
End Function
Function ShowDirList(folder)
Dim fs, f, f1, fc, i
‘Определяем динамический массив для хранения заглавий каталогов
ReDim dirarr(0)
Set fs = CreateObject(«Scripting.FileSystemObject»)
Set f = fs.GetFolder(folder)
Set fc = f.SubFolders
i=0
‘В цикле заполняем массив именами каталогов текущей папки
For Each f1 In fc
dirarr(i) = LCase(CStr(f1.Name))
i = i + 1
ReDim Preserve dirarr(i)
Next
‘Возвращаемрезультат
ShowDirList = dirarr
End Function
Function SortStr(arr)
Dim t,i,j
‘Сортировка способом «пузырька»
‘UBound — возвращает верхний индекс массива
For j = 0 To UBound(arr)-1
For i = j + 1 To UBound(arr)-1
‘StrComp — ассоциирует две строчки
‘Возвращает «-1», если строка1 < строка2; «0», если строка1=строка2; «1», если строка1 >
‘ строка2.
If StrComp(CStr(arr(i)), CStr(arr(j)), vbTextCompare) < 0 Then
t = arr(j)
arr(j) = arr(i)
arr(i) = t
End If
Next
Next
‘Возвращаемрезультат
SortStr = arr
End Function
Sub Main_Print(arr,flag)
‘flag = 1 — вывод для каталогов
‘flag = 0 — вывод для файлов
Dim i,k,tmp
i = 0
Select Case flag
Case 1
‘Если находимся в подкаталоге, то нужно предугадать возможность возвратиться
‘на уровень выше
If curr_dir2 <> «» Then
‘Отыскиваем крайнее вхождение знака разделителя каталогов «»
k = InStrRev(curr_dir2,»»)
If k <> 0 Then
‘Получаем имя каталога верхнего уровня
tmp = Mid(curr_dir2,1,k-1)
Response.Write «<tr>» ‘Вывод html
‘Для декорации используем графический файл open.gif — изображение открытой папки.
Response.Write «<td><img src=’open.gif’></td>»
‘Формируемссылкунаверхнийкаталог
Response.Write «<td><a target="_blank" href=’list_files.asp?dir=» & tmp & «‘>» & » .. » & «</a></td></tr>»
End If
End If
‘Главный цикл вывода заглавий каталогов
For i = 0 To UBound(arr)-1
Response.Write «<tr>»
Response.Write «<td><img src=’close.gif’></td>»
Response.Write «<td><a target="_blank" href=’ list_files.asp?dir=» & curr_dir2 & «» & arr(i) & «‘>» & arr(i) & _
«</a></td></tr>»
Next
‘Выводименфайлов
Case 0
‘Главный цикл вывода названий файлов
For i = 0 To UBound(arr)-1
Response.Write «<tr>»
Response.Write «<td><img src=’doc.gif’></td>»
‘Заменяем «» на «/» для использования в URL
‘Атрибут target нужен для указания ссылки на фрейм
Response.Write «<td><a target="_blank" href='» & root_vfolder & Replace(curr_dir2,»