Статья: Представление в 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 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 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 href='» & root_vfolder & Replace(curr_dir2,»»,»/») & «/» & arr(i) & _ «‘ target=’main’>» & arr(i) & «</a></td></tr>» Next End Select End Sub %> </BODY> </HTML> |
Далее необходимо написать страницу menu.htm, содержащую два фрейма, как было показано выше. Листинг приведен ниже:
|
<HTML> <HEAD> </HEAD> <FRAMESET COLS=»150,*»> <FRAME NAME=»contents» SRC=»list_files.asp»> <FRAME NAME=»main» SRC=»empty.htm»> </FRAMESET> </HTML> |
Файл empty.htm представляет собой пустой файл-заглушку для корректного отображения страницы в браузере Netscape Navigator.
|
<!-empty.htm <HTML> </HTML> |
Файлы list_files.asp, menu.htm, empty.htm необходимо поместить в каталог на Web-сервере с правом Script.
Далее в браузере набираем, например, http://localhost/scripts/menu.htm
Пример работы скрипта приведен на Рис.2.
Рис.2. 
Исходный файл проекта прилагается: files.zip