В этой статье я на примере расскажу, как используя ASP (Active Server Pages) можно построить содержимое каталога Web аналогично тому, как это выглядит на FTP сервере.
Постановка задачи: На Web-сервере есть каталог, например: C:\\InetPub\\wwwroot\\user1. Пусть данный каталог имеет несколько вложенных каталогов и набор файлов в этих каталогах.
В каждом из каталогов может находиться неограниченное количество файлов, либо некоторые из каталогов могут быть пустыми. Необходимо представить содержимое папки 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> <!-Серверный сценарий a <% Dim root_folder, root_vfolder, curr_dir, curr_dir2, temp_arr root_folder - переменная для хранения физического пути к корневой папке USER1 root_folder = "c:\\inetpub\\wwwroot\\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) Создаем объект 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=" Response.Write 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=" Response.Write 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,"\\","/") Response.Write "/" & arr(i) & _ " target=main>" & arr(i) & "</a></td></tr>" Next End Select End Sub %> </BODY> </HTML>
Далее необходимо написать страницу menu.htm, содержащую два фрейма, как было показано выше. Листинг приведен ниже: