Представление в 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:
'Отключаем
кэширование страницы
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)
%>
'Вызов процедуры, осуществляющей вывод
названий подкаталогов текущего каталога.
Call
Main_Print(temp_arr,1)
'Получаем массив, содержащий имена
файлов текущей папки.
temp_arr
= ShowFilesList(curr_dir)
'Сортируем массив строк
temp_arr
= SortStr(temp_arr)
'Вызов процедуры, осуществляющей вывод
имен файлов текущего каталога.
Call
Main_Print(temp_arr,0)
%>
'Очистка содержимого массива
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.
If
StrComp(CStr(arr(i)), CStr(arr(j)), vbTextCompare)
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 ""
'Вывод HTML
'Для украшения используем графический
файл open.gif - изображение открытой папки.
Response.Write
""
'Формируем ссылку на верхний каталог
Response.Write
"" & " .. "
& ""
End If
End If
'Основной цикл вывода названий
каталогов
For
i = 0 To UBound(arr)-1
Response.Write
""
Response.Write
""
Response.Write
"" & arr(i) & _
""
Next
'Вывод имен файлов
Case
0
'Основной цикл вывода имен файлов
For i = 0 To UBound(arr)-1
Response.Write
""
Response.Write
""
'Заменяем "" на
"/" для использования в URL
'Атрибут target нужен для указания
ссылки на фрейм
Response.Write
"
"'
target='main'>" & arr(i) &
""
Next
End
Select
End
Sub
%>
Далее необходимо написать страницу menu.htm,
содержащую два фрейма, как было показано выше. Листинг приведен ниже:
Файл empty.htm представляет собой пустой файл-заглушку
для корректного отображения страницы в браузере Netscape Navigator.
Файлы list_files.asp, menu.htm, empty.htm необходимо
поместить в каталог на Web-сервере с правом Script.
Далее в браузере набираем, например,
http://localhost/scripts/menu.htm
Пример работы скрипта приведен на Рис.2.
Рис.2.
Исходный файл проекта прилагается: files.zip
Список литературы
Для подготовки данной работы были использованы
материалы с сайта http://www.activex.net.ru/