Смекни!
smekni.com

Представление в Internet содержимого каталога средствами ASP

Представление в Internet содержимого каталога средствами ASP

Христофоров Юрий

В этой статье я на примере расскажу, как используя ASP (Active Server Pages) можно построить содержимое каталога Web аналогично тому, как это выглядит на FTP сервере.

Постановка задачи: На Web-сервере есть каталог, например: C:\InetPub\wwwroot\user1. Пусть данный каталог имеет несколько вложенных каталогов и набор файлов в этих каталогах. Примерная структура папок представлена на Рис. 1.

Рис. 1.

В каждом из представленных на рисунке каталогах может находиться неограниченное количество файлов, либо некоторые из каталогов могут быть пустыми. Необходимо представить содержимое папки user1 на Web-странице в дружественном для пользователя виде.

Интересной особенностью скрипта является то, что применяя страницу с фреймами (кадрами), можно построить меню пользователя.

Результат должен выглядеть примерно следующим образом:

Находимся в папке C:\Inetpub\wwwroot\user1\folder1\subfolder2:

На данном скриншоте показан пример меню. Страница 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:&bsol;inetpub&bsol;wwwroot&bsol;user1"'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)'СоздаемобъектFileSystemObjectSet fs = CreateObject("Scripting.FileSystemObject")Set f = fs.GetFolder(folder)Set fc = f.Filesi=0'В цикле заполняем массив именами файлов текущей папкиFor Each f1 In fcfarr(i) = LCase(CStr(f1.Name)) 'Преобразуем имя к нижнему регистру символовi = i + 1'УвеличениеразмерамассиваReDim Preserve farr(i)Next'ВозвращаемрезультатShowFilesList = farrEnd 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.SubFoldersi=0'В цикле заполняем массив именами каталогов текущей папкиFor Each f1 In fc dirarr(i) = LCase(CStr(f1.Name))i = i + 1ReDim Preserve dirarr(i)Next 'ВозвращаемрезультатShowDirList = dirarrEnd Function
Function SortStr(arr)Dim t,i,j'Сортировка методом "пузырька"'UBound - возвращает верхний индекс массиваFor j = 0 To UBound(arr)-1For 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 Thent = arr(j)arr(j) = arr(i)arr(i) = tEnd IfNextNext'ВозвращаемрезультатSortStr = arrEnd Function
Sub Main_Print(arr,flag)'flag = 1 - вывод для каталогов'flag = 0 - вывод для файловDim i,k,tmp i = 0 Select Case flagCase 1 'Если находимся в подкаталоге, то надо предусмотреть возможность вернуться 'на уровень выше If curr_dir2 <> "" Then'Ищем последнее вхождение символа разделителя каталогов "&bsol;"k = InStrRev(curr_dir2,"&bsol;")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)-1Response.Write "<tr>"Response.Write "<td><img src='close.gif'></td>"Response.Write "<td><a href=' list_files.asp?dir=" & curr_dir2 & "&bsol;" & arr(i) & "'>" & arr(i) & _ "</a></td></tr>" Next'ВыводименфайловCase 0 'Основной цикл вывода имен файловFor i = 0 To UBound(arr)-1Response.Write "<tr>"Response.Write "<td><img src='doc.gif'></td>"'Заменяем "&bsol;" на "/" для использования в URL'Атрибут target нужен для указания ссылки на фреймResponse.Write "<td><a href='" & root_vfolder & Replace(curr_dir2,"&bsol;","/") & "/" & 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