熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

深入理解ASP中FSO的神奇功能

2013-11-13 10:42:26  來源: .NET編程 

  在ASP中FSO的意思是File System Object即文件系統對象

  我們將要操縱的計算機文件系統在這裡是指位於web服務器之上所以確認你對此擁有合適的權限理想情況下你可以在自己的機器上建立一個web服務器這樣就能方便地進行測試如果運行於Windows平台請試一試微軟公司的免費個人Web服務器PWS

  FSO 模型對象

   Drive Object驅動器對象 供存取磁盤或者網絡驅動器
   FileSystemObject Object文件系統對象 供存取計算機的文件系統
   Folder Object文件夾對象 供存取文件夾的所有屬性
   TextStream Object文本流對象 供存取文件內容

  你可以使用上面的對象做計算機上的任何事情也包括破壞活動 ;( 所以請小心使用FSO在web環境中存儲信息是非常重要的比如用戶信息日志文件等等FSO提供了一個強大且簡單的方法高效率地保存數據在這篇文章裡面著重討論FileSystemObject和TextStream對象

  FSO由微軟公司提供支持對於非Windows系統大概不能再使用ASP

  怎麼樣使用FSO?

  為了使用FSO來執行所有的工作首先要創建對象代碼就象下面這樣

< % Set fso = ServerCreateObject("ScriptingFileSystemObject")
% >
  這樣就建立了FSO並且賦予變量fso接著就可以使用熟悉的objectmethod語法來執行文件系統的操作〔查看Visual Basic文檔獲取更多的關於對象和對象向導編程的知識〕在這裡我們可以使用fsomethod 或者 fsoproperty這些將在下面的例子中看到

  FSO模型位於由微軟提供的腳本運行時間DLL文件中它是scrrundll你可以在任何應用程序中引用這個DLL文件比如MS AccessWord 就是說並非僅僅限制在ASP中應用它

  這裡有一個簡要的FSO方法列表

FSO方法   CopyFile 拷貝一個或者多個文件到新路徑 CreateTextFile 創建文件並且返回一個TextStream對象 DeleteFile 刪除一個文件 OpenTextFile 打開文件並且返回TextStream對象以便讀取或者追加
  如果想了解完整的FSO方法與屬性請查閱微軟MSDN下面來看幾個例子

  假設你想創建一個簡單的留言簿你可以建立一個數據庫在其中存儲用戶的信息然而如果並不需要數據庫的強大功能使用FSO來存儲信息將節省你的時間和金錢並且一些ISP也許限制了web上的數據庫應用

  假設你在一個表單中收集了一些用戶信息這裡是一個簡單表單HTML代碼

< html>
< body>

< form action="formhandlerasp" method="post">
< input type="text" size="" name="username">
< input type="text" size="" name="homepage">
< input type="text" size="" name="Email">
< /form>
< /body>
< /html>
  再看看formhandlerasp中處理表單的代碼

< %
Get form info
strName = RequestForm("username")
strHomePage = RequestForm("homepage")
strEmail = RequestForm("Email")

create the fso object
Set fso = ServerCreateObject("ScriptingFileSystemObject")
  迄今為止還沒有新鮮的東西無非是獲取表單域的值並且賦值到變量下面出現了有趣的部分 - 寫文件

path = "c: emp esttxt"
ForReading = ForWriting = ForAppending =

open the file
set file = fsoopentextfile(path ForAppending TRUE)

write the info to the file
filewrite(strName) & vbcrlf
filewrite(strHomePage) & vbcrlf
filewrite(strEmail) & vbcrlf

close and clean up
fileclose
set file = nothing
set fso = nothing
  回想一下OpenTextFile方法返回一個TextStream對象它是FSO模型中的另外一個對象TextStream對象揭示了操作文件內容的方法比如寫讀一行跳過一行VB常量vbcrlf產生一個換行符

  在OpentextFile的命令參數中定義了TRUE這就告訴了系統如果文件不存在就創建它如果文件不存在並且沒有定義TRUE參數就會出錯

  現在轉到目錄c: emp打開testtxt你可以看到如下的信息

Users name
Users home page
Users email
  當然這些單詞可以被輸入在表單中的任何內容所替換

  現在已經有了一些用戶信息保存在文件中就像一個簡單的數據庫假設有一個用戶想了解所有的訪問者就要從登記的信息中分離出相關部分因為沒有象數據庫一樣擁有結構化的列

  我們知道在所創建的文件中行是用戶名行是他們的主頁行是他們的電子郵件地址隨後登記的用戶也是按照這樣的結構存儲他們的信息所以每行將包含一個用戶的登記信息知道了這些就可以編寫下面的代碼來顯示信息

< %
create the fso object
set fso = ServerCreateobject("ScriptingFileSystemObject")
path = "c: emp esttxt"

open the file
set file = fsoopentextfile(path ) < For
reading
  接著分析每一行並且格式化數據

do until fileAtEndOfStream
Responsewrite("Name: " & fileReadLine & " ")
Responsewrite("Home Page: " & fileReadLine & " ")
Responsewrite("Email: " & fileReadLine & "< p>")
loop

close and clean up
fileclose
set file = nothing
set fso = nothing
%>
  這裡僅僅做了一個非常簡單的輸出但是你可以根據情況包含表格或者DHTML表單信息

  如果已經正確地建立並寫入了文件上面的小小循環將合適地列出數據庫中的每一個人的信息ReadLine方法讀取行內容直到遇到換行符隨後的ReadLine調用將讀取下一行AtEndOfStream是TextStream對象的屬性它告訴我們何時遇到文件的尾部

  假設由於某種原因我們沒有正確地形成文件如果一個用戶只有行信息而不是那麼就會產生一些錯誤我們這裡的循環取回文件中的下行信息如果沒有行多的信息就將出現如下的錯誤信息

Server object error ASP : ae   
  所以一定要添加一些錯誤處理代碼以防文件中插入了多余的行或者少了必要的行信息

  上面討論了基本知識然後說說權限許可的問題FSO以創建它的用戶帳戶權限運行換言之如果有人從Internet上訪問你的頁面那麼這個internet帳戶就創建FSO如果以administrator的身份登錄計算機並且登錄頁面那麼administrator帳戶就創建了FSO這是非常重要的因為一定的帳戶擁有一定的權限並且FSO需要一些權限從而能完整的執行功能

  internet帳戶(IUSER_MachineNameMachineName是服務器的名字)一般只擁有讀權限這意味著用戶將不能寫入留言簿文件然而有幾個選擇可以繞過這個問題

  首先也是很困難的是要求用戶在填寫留言簿前登錄到服務器然而留言簿的要點是從匿名用戶處收集信息如果要求用戶登錄就必須要知道他們是誰因此跳過這個選擇看下一個

  第個方法是創建一個目錄或者文件IUSER_MachineName用戶對此有寫權限這樣做可能開放了一些潛在的安全漏洞因為任何知道正確目錄並具備一定web技巧的人就能在服務器上填充內容這是一個很嚴重的禁忌所以你必須確認在隱藏的場所保存了這些可寫目錄的信息並且盡可能地將這些目錄設置在web目錄結構以外(比如在Windows下這是一個不在inetpub目錄下的一個目錄)

  你也許想現在我知道如何寫入文件了但能做到更多一些嗎?下面來試一試為web站點建立一個搜索功能

  建立搜索引擎的關鍵是遞歸主要地編寫一段代碼搜索目錄下的文件然後對所有的目錄循環執行同樣的代碼因為不能確定總共有多少個子目錄所以必須一遍又一遍地執行搜索代碼直到結束遞歸調用非常好!

  下面來創建搜索頁面假設已經建立了一個HTML表單用戶在其中輸入一個搜索字符串

Dim objFolder
Dim strSearchText
Dim objFSO

strSearchText = RequestForm("SearchText") < The search string
create the FSO and Folder objects
Set fso = ServerCreateObject("ScriptingFileSystemObject")
Set objFolder = objFSOGetFolder(ServerMapPath("/"))

Search objFolder
  上面的代碼簡單地初始化變量Search函數執行搜索功能描述如下

Function Search(objFolder)

Dim objSubFolder

loop through every file in the current
folder

For Each objFile in objFolderFiles
 Set objTextStream = objFSOOpenTextFile(objFilePath) < For Reading

  read the files contents into a
 variable

 strFileContents = objTextStreamReadAll

  if the search string is in the file then
 write a link

  to the file

 If InStr( strFileContents strSearchText ) then

  ResponseWrite "< A HREF=""/" & objFileName & _

   """>" & objFileName & "< /A>< BR>"
  bolFileFound = True
 End If
 objTextStreamClose
Next

Heres the recursion part for each
subfolder in this directory run the Search function again

For Each objSubFolder in objFolderSubFolders
 Search objSubFolder
Next

End Function
  為了能打開文件FSO需要實際的文件路徑而不是web路徑比如是c:inetpubwwwroot empindexhtml 而不是wwwenfusedcom/temp/indexhtml 或者 /temp/indexhtml 為了將後者轉換為前者使用ServerMapPath("filename") filename表示web路徑名

  上面的代碼將在你指定的初始目錄下的文件夾的每一個子目錄中執行在這裡初始目錄是指web根目錄“/”然後就簡單地打開目錄下的每一個文件看看其中是否包含指定的字符串如果找到字符串就顯示那個文件的鏈接

  注意隨著文件和子目錄數量的增加搜索花費的時間也將增加如果需要繁重的搜索工作建議你采取其他的方法比如微軟公司的索引服務器Index Server

  到此你對FSO可能已經有了很好的體會讓我們再深入研究一步來解決更復雜的難題

  首先你可能希望對文件改名為了跟蹤所有的文檔你將要重新命名它們以便唯一這樣就可以被系統容易地區別很不幸FSO不允許簡單的文件改名操作所以我們不得不修改一下

< %
create the fso object
set fso = ServerCreateobject("ScriptingFileSystemObject")
path = "c: emp esttxt"
strDate = Replace(Date() "/" "")
strDir = "c:inetpubwwwrootarticles" & strDate
strNewFileName = Hour(Now) & "_" & Minute(Now) & "_" &
second(Now) & "html"

open the old file
set file = fsoopentextfile(path ) < For reading
strText = filereadall
set file = nothing

check for and/or create folder
if not fsofolderexists(ServerMapPath(strDir)) then
set f = fsoCreateFolder(ServerMapPath(strDir))
else
set f = fsoGetFolder(ServerMapPath(strDir))
end if

create and write new file
set file = fsoCreatetextfile(fpath & "" & strNewFileName)
filewrite(strText)
set f = nothing
fileclose
set file = nothing

delete the old file
fsoDeleteFile(path & "" & rst("FileName") & i)
clean up
set fso = nothing
%>
  FSO能力的不足在這裡卻成了優勢我們可以一次執行首先打開文件並讀入文件的內容假設這裡要創建一個唯一的文件夾和一個唯一的文件來存儲文章然而因為文件夾的路徑每天都將改變所以必須首先檢查是否文件夾已經存在如果不存在就創建它這在if not fsofolderexists代碼段完成然後取得那個路徑創建一個新的文件新文件建立完成後刪除掉舊文件這通過fsoDeleteFile來完成

   這步就是對文件改名然後移動到一個更合適的目錄下注意在這裡還可以對文件進行更多地操作比如在寫入新文件前進行一下內容的編輯

   FSO確實存在一些弱點 - 比如它很難處理二進制文件這包括Word文檔許多圖形格式的文件和其他一些文件然而你仍然可以用其他的方式操作這些文件 - 移動它們刪除它們等等你不能做的就是對它們進行打開或者寫操作

  另外一個限制是對於文件長度的問題當立刻讀寫一些內容時所有的信息都存儲在內存中 - 內容越多消耗的內存就越大這將使每個工作都變得慢起來所以如果需要操作非常大的文件或者大量的小文件時考慮將文件分割成小塊並且經常的清除內存將應用程序融入進COM對象組件也能大大地提高程序的速度

  同樣你也不能使用FSO來管理權限以及文件文件夾的屬性執行安全加密的一個很好方法就是將前面提到的留言簿文件設置為只讀在需要時再設置為可寫然後再修改回來這個方法經常在CGI和Perl使用但是很不幸還沒有令人滿意的方法來用FSO實現

  還能用FSO做什麼?

  在FSO中還有許多很棒的功能但許多人沒有意識到這些功能常常是在你感到做某些事情很難後才發現的這時你經常要感歎到要是我早知道這個方法就好了!

  下面列舉一下這些不常用但是卻非常酷的功能

  很少被了解的FSO功能

  GetSpecialFolder Method 返回特定的Windows文件夾的路徑: Windows安裝目錄Windows系統目錄Windows臨時目錄 FSOGetSpecialFolder([ or ]) GetTempName Method 返回一個隨機產生的文件或者目錄名字用於需要存儲臨時數據時GetAbsolutePathName Method 返回文件夾的絕對路徑(類似於ServerMapPath)

  比如FSOGetAbsolutePathName("region") 將返回類似於下面的結果"c:mydocsmyfolder egion"
GetExtensionName Method 返回路徑中最後部分的擴展名(比如FSOGetExtensionName("c:docs esttxt") 將返回txt) GetBaseName and GetParentFolder Methods 返回路徑中最後部分的父文件夾
(比如FSOGetParentFolder ("c:docsmydocs") 將返回docs) Drives Property 返回所有本地可用驅動器的集合用於建立資源浏覽器樣的用戶接口

  使用上面的功能時最好建立好出錯處理的代碼因為如果需要的參數不存在將會產生麻煩的信息

  總結

  如我們所見FSO非常有用這裡介紹的僅僅是冰山一角你可以使用FSO建立功能強大的應用程序簡單地完成許多任務


From:http://tw.wingwit.com/Article/program/net/201311/14341.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.