張智星 jang@mirlab.org http://mirlab.org/jang 台大資工系 MIR實驗室 第二十章 檔案與目錄 張智星 jang@mirlab.org http://mirlab.org/jang 台大資工系 MIR實驗室
本章大綱 大綱 主題 本章說明如何使用 JScript 來進行檔案和目錄的處理,並說明三個實際應用的範例。 20-1:檔案與路徑處理 20-2:目錄處理 20-3:應用範例一:記數網頁 20-4:應用範例二:線上檔案修改 20-5:應用範例三:MATLAB 程式碼分享
20-1:檔案與路徑處理 本小節介紹如何使用ASP對檔案做讀寫處理。
範例20-1: pathFunction01.asp 主題:FileSystemObject 對於實體路徑的處理功能 說明 Webpage: remote host, local host 程式碼重點 說明 此範例使用 Request.ServerVariables(“PATH_TRANSLATED”) 來取出範例檔案的實體絕對路徑,然後再使用 FileSystemObject 的各種函數來取出此路徑的重要部分。 physicalPath=Request.ServerVariables("PATH_TRANSLATED"); fso = Server.CreateObject("Scripting.FileSystemObject");
範例20-2: pathFunction02.asp 主題:FileSystemObject 對於 Web 路徑的處理功能 說明 Webpage: remote host, local host 程式碼重點 說明 此範例使用 Request.ServerVariables("SCRIPT_NAME") 來取出範例檔案的 Web 路徑,然後再使用 FileSystemObject 的各種函數來取出此路徑的重要部分。 webPath=Request.ServerVariables("SCRIPT_NAME"); fso = Server.CreateObject("Scripting.FileSystemObject");
ASP 對檔案的讀寫 補充說明 名詞解釋: 實體路徑:本機作業系統所看到的路徑。 Web 路徑:網頁伺服器所看到的路徑。 一般而言,在 ASP 程式碼中所用的檔案名稱都是伺服器所看到的名稱,必須經由下列兩種方式,才能轉到標準的實體絕對路徑,此時才能對檔案進行各種處理。 變數:Request.ServerVariables("PATH_TRANSLATED") 函數:Server.MapPath(fileName)
存取磁碟機、檔案或資料夾 若要存取現有的磁碟機、檔案或資料夾,請使用 FileSystemObject 物件中相關的方法,如下: GetFile() GetFolder() GetDrive() 這三個函式的輸入都是一個路徑,輸出則是相關的物件,我們就可以使用此物件來取得相關的性質或是呼叫相關的方法。
範例20-3 主題:列出檔案的屬性 說明 Webpage: remote host, local host 程式碼重點 本範例使用 FileSystemObject 物件的 GetFile() 方法,抓出檔案物件,然後列舉此檔案物件的屬性。 Open question: 如何自動列出所有性質? file = fso.GetFile(fullPath);
範例20-4 主題:開啟檔案進行讀寫 說明 Webpage: remote host, local host 程式碼重點 使用 Server.MapPath() 來產生實體絕對路徑。 產生 test.txt 檔案來進行寫讀。 absPath=Server.MapPath(fileName); // 轉成實體絕對路徑 // 2 代表寫入,true 代表若檔案不存在,則自動產生新檔案 fid = fso.OpenTextFile(absPath, 2, true); fid.WriteLine(string); //將字串寫入檔案 fid = fso.OpenTextFile(absPath, 1); // 1 代表唯讀 output = fid.ReadAll(); //讀取檔案所有資料
範例20-5 主題:檢查硬碟所剩空間 說明 Webpage: remote host, local host 程式碼重點 d is the object for a give drive. d = fso.GetDrive(fso.GetDriveName(drivePath))
新範例 主題:列出硬碟相關性質 說明 Webpage: remote host, local host 程式碼重點 Open question: 如何自動列出所有性質? drive = fso.GetDrive(“c:”)
20-2:目錄處理 本小節介紹ASP對MS Windows目錄的處理。
範例20-6 主題:列出資料夾的屬性 說明 Webpage: remote host, local host 程式碼重點 GetParentFolderName()取得上層目錄名稱。 GetFolder()取得此目錄物件。 Open question: 如何自動列出所有性質? fso = Server.CreateObject("Scripting.FileSystemObject"); fileName = Request.ServerVariables("SCRIPT_NAME"); absPath = Server.MapPath(fileName); parentFolder = fso.GetParentFolderName(absPath); folder = fso.GetFolder(parentFolder);
範例20-7 主題:列出目錄中的內容 說明 Webpage: remote host, local host 程式碼重點 「開放目錄瀏覽權限」的功能可經由 Web 伺服器的管理系統來達成,但是要修改此選項,須具有 Administrator 權限。此範例是直接使用 ASP 程式碼來達成此功能,因此不需要修改伺服器的設定。 var fileList=new Enumerator(fd.files); for (fileList.moveFirst(); !fileList.atEnd(); fileList.moveNext()){ … }
範例20-8 主題:建立與刪除目錄 說明 Webpage: remote host, local host 程式碼重點 CreateFolder()建立一個目錄。 DeleteFolder()刪除一個目錄。 使用“\\”來代替有特殊意義的“\”字元。 fso.CreateFolder ("C:\\Bogus"); fso.DeleteFolder ("C:\\Bogus");
GetSpecialFolder()函式 輸入參數值 回傳目錄 典型值 Windows 資料夾,包含由 Windows 作業系統所安裝的檔案 C:\WINDOWS 1 System 資料夾,包含程式庫、字型和週邊設備驅動程式 C:\WINDOWS\system32 2 暫存資料夾,是用來儲存暫存檔。它的路徑設在 TMP 環境變數中 C:\WINDOWS\Temp
範例20-9 主題:取得特殊目錄 說明 Webpage: remote host, local host 程式碼重點 有時候我們會需要寫入暫存檔,這時候fso.GetSpecialFolder(2)就很適合。 windowsFolder = fso.GetSpecialFolder(0); // Windows 資料夾 systemFolder = fso.GetSpecialFolder(1); // System 資料夾 temporaryFolder = fso.GetSpecialFolder(2); // 暫存資料夾
範例20-10 主題:寫入暫存檔案 說明 Webpage: remote host, local host 程式碼重點 取得一個暫存檔案名稱,再開檔於暫存資料夾中。 每次暫存檔案名稱都會不同,因此不會蓋掉原有的檔案名稱。 tempFile = fso.GetTempName(); tempDir = fso.GetSpecialFolder(2); fid = tempDir.CreateTextFile(tempFile);
20-3:應用範例一:記數網頁 本節將使用兩個小範例來說明如何使用 JavaScript 進行檔案讀取與目錄讀取的應用。
範例20-11 主題:將計數器的資料放在檔案中 說明 Webpage: remote host, local host 先產生一個 FileObject 的物件,再經由此物件的 OpenTextFile 方法來開啟記數檔案並回傳檔案指標 Out。 經由 Out 的 ReadLine 和 WriteLine 方法來對檔案進行讀取和寫入。 由於記數資料室儲存在檔案之中,因此並不會因為伺服器的重開機而造成記數資料的流失。
範例20-12 主題:將計數器功能寫在函數中 Webpage: remote host, local host, counter.inc 程式碼重點 說明 在上述範例中,記數檔案的名稱都是原網頁檔案名稱再加上 ".cnt",因此只要在原網頁導入 counter.inc,此網頁就具有個別記數功能。 檔案包含兩個函數,可以分別用在 JScript 和 VBScript。 counterFile=Request.ServerVariables("PATH_TRANSLATED")+".cnt";
20-4:應用範例二:線上檔案修改 本節介紹如何線上修改網頁的範例。
修改伺服器端網頁 一般而言,若要從遠方修改伺服器端的網頁,有下列兩種方式: 經由 telnet 連上伺服器,然後再修改之。 經由 ftp 連上伺服器,下載相關檔案並修改後,再經由 ftp 上傳檔案至伺服器。(UltraEdit 就有此內建的功能。) 事實上,我們也可以經由 Web 程式的技術,經由瀏覽器來修改遠端的伺服器檔案。
範例20-13 主題:線上檔案修改的範例 說明 連結:執行結果 檢視原始碼 連結:執行結果 檢視原始碼 說明 由於使用者可以經由「熱鍵」的方式來進行編修功能的啟動,因此在目標網頁 editfile.asp 並無法經由 Request.ServerVariables("HTTP_REFERER") 來取得來源網頁(在此例是 example.asp),因此我們必須在 editfile.inc 設定 session("source"),以方便當使用者按下「移除認證」時,視窗能載入來源網頁。
範例所牽涉的檔案(1) 在此範例中,總共牽涉到六個檔案,分別說明如下: example.asp 此網頁包含了 editfile.inc,所以可以進行經由 Web 的編修。 editfile.inc 此頁包含了「熱鍵」的定義,並設定了 session("source")。任何網頁只要保含此檔案,就具有遠方編修的功能。 editfile.asp 本頁之任務為讀入需要編修的檔案,並以 textarea 的方式呈現在瀏覽器中,以方便使用者編修。 delauth.asp 本頁之任務為消除認證資訊,並載入來源網頁example.asp。
範例所牽涉的檔案(2) auth.inc 本頁之任務為檢驗認證資訊是否存在: auth.asp 此頁之目的為進行密碼認證: 若存在,則不做任何事。 若不存在,則跳出認證視窗(auth.asp),請求輸入密碼,並在原視窗載入來源網頁(此例為 example.asp)。 任何需要密碼保護之網頁,只需要 include 此檔案,即可達到保護功能。 auth.asp 此頁之目的為進行密碼認證: 若通過,則於原視窗開啟被保護之目標網頁 editfile.asp。 若不通過,則請求重新輸入帳號、密碼 。
20-5:應用範例三:MATLAB 程式碼分享 本節利用檔案處理,分享MATLAB程式碼。
範例20-14 主題:MATLAB分享程式碼範例 說明 Webpage: remote host, local host 我們使用 JScript 來及時抽取出來每一個 MATLAB 函式的說明,並彙整在網頁上。同時我們也根據每一個檔案格式的不同,來分類成函式檔案(Function Files)和底稿檔案(Script Files),分開顯示。