Hướng dẫn viết FileBrowser đơn giản
I/ Giới thiệu
Bạn đã bao giờ thấy một chương trình duyệt file như thế này chưa?

Nó là một chương trình chạy trên web, nó cho phép bạn "Đi chợ trên server". Tôi tin sau khi bạn đã làm được một FileBrowser đơn giản như FileBowser sử dụng trong bài viết này, sẽ không khó cho bạn để phát triển nó thành một công cụ duyệt file chuyên nghiệp.
II/ Xây dựng.
Trước hết, chúng ta dựng lên khung chính cho chương trình:
<table width=100% border=0>
<tr>
<td colspan=2><%showDrive%></td> // Hiển thị các ổ đĩa trên server (Drive)
</tr>
<tr>
<td colspan=2><span id=path><%showCurrentPath%></span> // Hiển thị đường dẫn hiện tại (Current path)
</tr>
<tr>
<td width=30% valign=top>
<%showSubFolder%> // Hiển thị các subfolder trong folder hiện tại
</td>
<td valign=top>
<%showFile%> // Hiển thị tất cả file trong folder hiện tại
</td>
</tr>
<tr>
<td> </td>
<td align=center> // Hiển thị các nút lệnh
<input type=submit name=submit class=submit value='Search'> 
<input type=submit name=submit class=submit value='Copy'> 
<input type=submit name=submit class=submit value='Edit'> 
<input type=submit name=submit class=submit value='Delete'> 
<input type=submit name=submit class=submit value='Upload'> 
</td>
</tr>
</table>
Ở trên, chúng ta đã dựng xong xườn của trang và mô tả các hàm. Tiếp theo chúng ta sẽ xây dựng các hàm:
+ showDrive(): Liệt kê các ổ đĩa.
+ showCurrentPath(): Cho biết đường dẫn hiện tại
+ showSubFolder(): Liệt kê các subfolder trong folder hiện tại
+ showFile(): Liệt kê các file trong file hiện tại
III/ Lập trình.
Đối tượng chúng ta sử dụng chính trong bài này là Scripting.FileSystemObject. FileSystemObject sẽ được sử dụng xuyên suốt trong bài viết này. Vì vậy ta nên khai báo đối tượng này ở đầu trang. Nên nhớ, không giống như cách sử dụng biến, sử dụng đối tượng( object) phải đúng quy tắc "Tạo, hũy", có nghĩa là có tạo nên object thì phải có giải phóng cho object đó.
<%
// Đầu trang, tạo đối tượng fs
Set fs = Server.CreateObject("Scripting.FileSystemObject")
// Nội dung trang
// Cuối trang, huỹ đối tượng fs
Set fs = Nothing
%>
Sau đây là các hàm được viết trong phần nội dung trang.
1/ Hàm showDrive()
Trong hàm này chúng ta quan tâm tập hợp Drives. Tập hợp này chứa tất cả các drive trên server. Bạn cũng quan tâm đến Server.MapPath, nó rất hữu dụng cho bạn trong việc biết đường dẫn tương đối thành đường dẫn tuyệt đối.
<%
Sub showDrive()
s=" <img src= 'images/folder_close.gif'><ahref='?p="&Server.MapPath("/")&"'><b>[Root]</b></a>"
// Server.MapPath("/") trả về thư mục gốc --> Root
Set drv = fs.drives // Lấy tập hợp Drives
For each d in drv // Duyệt trong tập hợp Drives
If d.DriveType=Remote then // Nếu đĩa không nằm trên máy hiện tại( trường hợp Map Network Drive) --> Lấy ShareName
s = s &" <img src = 'images/drive.gif'><ahref= '?p="&d.DriveLetter&":\'>Drive "&d.ShareName&"</a>"
Else
If d.isReady then // Nếu ổ đĩa sẳn sàng --> Lấy VolumeName + DriveLetter
s = s &" <img src = 'images/drive.gif'><ahref= '?p="&d.DriveLetter&":\'>"&d.VolumeName&"["&d.DriveLetter&"]"&"</a>"
Else // Lấy DriveLetter
s = s &" <img src = 'images/drive.gif'><ahref= '?p="&d.DriveLetter&":\'>Drive "& d.DriveLetter&"</a>"
End If
End If
Next
Response.Write("<span><b>" &s &"</b></span>") // Viết kết quả
Set drv=nothing // Hũy đối tượng này
End Sub
// p: tham số truyền bằng QueryString --> Chỉ đường dẫn
%>
Kết quả:

2/ Hàm showCurrentPath()
Hàm này chỉ việc lấy giá trị đường dẫn hiện tại trong QueryString và xuất ra.
<%
Sub showCurrentPath()
Path = Request.QueryString("p")
If Path = "" then Path = "c:\" End If //Trường hợp Path bằng rỗng thì gán giá trị mặt định "C:\"
Response.Write(" <img src= 'images/folder_open.gif'><b><font color=red>" &p &"</font></b>") //Ghi kết quả
End Sub
%>
3/ Hàm showSubFolder()
Hàm này duyệt tất cả các subfolder trong folder hiện tại bằng tập hợp SubFolders và list ra kèm theo một nút check để người dùng có thể chọn lựa và thao tác hàng loạt trên các subfolder. Bạn có thể thêm một nút DeleteFolder hay CopyFolder dựa vào các check box này. Trong bài viết này thì tôi không đũ thời gian để đề cập đến vấn đề đó.
<%
Sub showSubFolder()
Path = Request.QueryString("p")
If Path = "" then Path = "c:\" End If //Trường hợp Path bằng rỗng thì gán giá trị mặt định "C:\"
Set f = fs.getFolder(Path) // Lấy folder hiện tại, Path phải là đường dẫn tuyệt đối
Set subf = f.SubFolders // Lấy các subfolder trong folder hiện tại
parent = Path // Tạo gía trị cho thư mục cha = folder hiện tại
If not f.isRootfolder then // Nếu folder hiện tại không phải thư mục góc -RootFolder
parent = fs.getParentFolderName(parent) // Lấy thư mục cha
End If
s = "<tr><td><img src= 'images/folder_close.gif'> <ahref='?p= " &parent &"'><b>[ . . ]</b></a><br></td><td width= '1%'></td></tr>"
For each sf in subf // Duyệt tất cả các subfolder trong folder hiện tại
s = s &"<tr><td><img src='images/folder_close.gif'>" // Icon
s = s &"<ahref = '?p="&p &"\" &sf.name &"'> " &sf.Name &"</a><br></td>" // Tên subfolder
s = s &"<td><input type=checkbox name=folder value='" &sf.Name &"'></td></tr>" // Ô chọn subfolder
Next
Response.Write("<div class=textarea><table width='100%'>" &s &"</table></div>") // Hiển thị kết quả
Set f = Nothing
Set subf = Nothing
End Sub
%>
Kết quả:

4/ Hàm showFile()
Tập hợp Files chứa tất các các file trong thư mục hiện tại. Công việc của chúng ta là trỏ vào folder cần duyệt file và duyệt trong tập hợp Files. Mỗi file trong tập hợp file có các thuộc tình của nó, bạn cần biết cách khai thác các thuộc tính này.
<%
Sub showFile
Path = Request.QueryString("p")
If Path = "" then Path = "c:\" End If //Trường hợp Path bằng rỗng thì gán giá trị mặt định "C:\"
// Trong mỗi hàm đều Request giá trị p để tão giá trị cho Path
// Vậy để tránh viết các dòng này nhiều lần, bạn có thể Request một lần và sử dụng giá trị Path như một biến toàn cục
Set f=fs.getFolder(Path) // Lấy folder hiện tại
Set files=f.Files // Lấy tất cả các file trong folder hiện tại
// Tạo dòng tiêu đề các cột
s = "<tr><td bgcolor=#cccccc width='5%'> </td>"
s = s &"<td bgcolor=#cccccc width='30%'>Name</td>"
s = s &"<td bgcolor=#cccccc>Size</td>"
s = s &"<td bgcolor=#cccccc width='25%'>Modified</td>"
s = s &"<td bgcolor=#cccccc>Type</td>"
s = s &"<td bgcolor=#cccccc>Attr</td></tr>"
For each file in files //Duyệt tất cả các file
s = s &"<tr><td> <input type=checkbox name=file value='" &file.Name &"'></td>"
//Icon. Bạn có thể thay đổi các icon tuỳ theo đuôi file cho chương trình thêm sinh động
s = s &"<td><img width=16 src='images/file.gif'>"
s = s &"<a target= '_blank'href='ViewFile.asp?p= "&p&"\" &file.Name&"'> &file.Name &"</td>"
s = s &"<td>" &file.Size &" Bytes</td>"
s = s &"<td>" &file.DateLastModified &"</td>"
s = s &"<td>" &file.Type &"</td></tr>"
Next
// Xuất kết quả
Response.Write("<div class=textarea><table width='100%'>"&s&"</table></div>")
Set f=Nothing
Set files=Nothing
End Sub
%>
Kết quả:

IV/ Lời cuối
Vì thời gian có hạn nên không thể đề cập chi tiết hơn. Bạn hãy phát triển FileBrowser cho riêng bạn với các chức năng đầy đủ hơn, các tính năng độc đáo hơn. Sau đây là một số gợi ý để phát triến nó thành một tool hoàn hảo:
1/ Chức năng CopyFile, CopyFolder.
2/ Chức năng EditFile.
3/ Chức năng DeleteFile, DeleteFolder.
4/ Chức năng UploadFile.
5/ Chức năng DownloadFile.
6/ Chức năng CompressFile, CompressFolder.
7/ Chức năng ModifyFile, ModifyFolder.(*)
Bạn hoàn toàn có thể làm được.
Cảm ơn bạn đã đọc bài viết!
-----------------------------------------------------------
Cube
