ASP.NET 4.0 專題實務 I 17-1 System.IO 命名空間 要使用檔案, 務必在程式上方宣告 System.IO 命名空間 (Namespace) 如果用在 Inline Code( 把程式跟 HTML 寫在同一個.aspx 檔裡面 ), 必須寫成 : Page Langu

Similar documents
投影片 1

Microsoft PowerPoint - 06.ppt

Microsoft PowerPoint - VB14.ppt

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF

untitled

untitled

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

Visual Basic D 3D

投影片 1

Chapter 16 集合

星星排列 _for loop Protected Sub Page_Load(ByVal sender As Object, ByVal e As Dim h As Integer = 7 'h 為變數 ' Dim i, j As Integer For i = 1 To h

封面-12

Microsoft Word - 投影片ch14

untitled

6-1 Table Column Data Type Row Record 1. DBMS 2. DBMS MySQL Microsoft Access SQL Server Oracle 3. ODBC SQL 1. Structured Query Language 2. IBM


導讀 ASP.NET HTML ASP 第一篇 基礎篇第 1 章 認識 ASP.NET ASP.NET ASP.NET ASP.NET ASP.NET 第 2 章 認識 Visual Studio 20 開發環境 Visual Studio 20 Visual Studio 20 第二篇 C# 程式

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

1 1 Excel VBA 說明 ( ) (_) STEP4 Excel 2 STEP5 A1 1 B2 2 C3 3 STEP6 A1 STEP7 > > 1-11

運算子多載 Operator Overloading

The golden pins of the PCI card can be oxidized after months or years

Visual C# 2005程式設計

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

Excel VBA Excel Visual Basic for Application

27 :OPC 45 [4] (Automation Interface Standard), (Costom Interface Standard), OPC 2,,, VB Delphi OPC, OPC C++, OPC OPC OPC, [1] 1 OPC 1.1 OPC OPC(OLE f

輕鬆學 Dreamweaver CS5 網頁設計..\Example\Ch0\ \.html..\example\ch0\ \mouse.txt..\example\ch0\ \ _Ok.html 學習重點 JavaScript 複製程式碼 mouse.txt Ctrl+C Ctrl+C 0-4

<4D F736F F D B0D3B77EC3FEA7DEC3C0C476C1C9A5BFA6A1B8D5C3442DB57BA6A1B35DAD702DBEC7ACEC2E646F6378>

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

使用手冊

C/C++ Programming

Microsoft Word - 01.DOC

C/C++ Basics

untitled

RunPC2_.doc

<4D F736F F D E466F726DB3CCD0F2C9E8BCC6D3EBCAB5BCF920B5DA35D5C22E646F63>

CC213

Spyder Anaconda Spyder Python Spyder Python Spyder Spyder Spyder 開始 \ 所有程式 \ Anaconda3 (64-bit) \ Spyder Spyder IPython Python IPython Sp

IsPostBack 2

epub83-1

chp6.ppt

untitled

CU0594.pdf

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

RUN_PC連載_10_.doc

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

Maasa停車場管理系統

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

Microsoft PowerPoint - OPVB1基本VB.ppt

3 Driver do Microsoft Access (*.mdb) hisdata IFIX 1.4

untitled

Microsoft PowerPoint - Class5.pptx

Microsoft Word - 小心翼翼的二十一點N.doc

epub 61-2

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

untitled

EJB-Programming-4-cn.doc

2016 勒索軟體白皮書

四川省普通高等学校

R 與資料處理 R 與資料處理 Wush Wu 國立台灣大學 1 of 58

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

多層次傳銷與獎金系統

untitled

VB控件教程大全

一 個 SQL Injection 實 例 的 啟 示 頁 2 / 6 因 此, 在 知 名 網 站 上 看 到 SQL Injection, 讓 人 驚 心, 卻 不 意 外 網 站 專 案 外 包 是 目 前 業 界 的 常 態, 而 在 價 格 取 勝 的 制 度 下, 低 價 得 標 的 S

untitled

Microsoft Word - ch04三校.doc

chapter 2 HTML5 目錄iii HTML HTML HTML HTML HTML canvas

Android Service

Microsoft PowerPoint - VB5

Microsoft Word - CX1000-HMI_程序开发_PLC通讯

Microsoft PowerPoint - 第14章.ppt

Microsoft Word - ACI chapter00-1ed.docx

ThreeDtunnel.doc

Python 與中文處理

概述

JavaIO.PDF

Chapter 3 Camera Raw Step negative clarity +25 ] P / Step 4 0 ( 下一頁 ) Camera Raw Chapter 3 089

新版 明解C++入門編

C H A P T E R 7 Windows Vista Windows Vista Windows Vista FAT16 FAT32 NTFS NTFS New Technology File System NTFS

Transcription:

CHAPTER 17 資料流 I/O 與檔案 檔案的應用, 在程式設計上一直是個重點 雖然有了資料庫幫我們記錄資料, 但有些小資料不需要勞師動眾 也不必存放太久, 如果用一個文字檔來記錄, 反而更簡單 舉例來說, 尚未上線的系統 或是有些功能繁雜的程式要撰寫 我們就可以利用檔案的功能來做記錄 一邊測試一邊記錄這些程式在各階段的運作狀況, 每個階段成功與否都可以直接寫入文字檔裡面, 不需要跟資料庫搶資源 搶連線 畢竟小檔案 I/O 的速度, 一般來說都快過資料庫 以前我做過 B2B 的案子, 用 Rosettanet XML 來傳遞資料 ( 關於 Rosettanet, 請看中文網站的說明,http://www.rosettanettaiwan.org. tw/) 當時用的技術是 VB 6.0 + ASP + MS BizTalk Server + MS SQL Server 2000 依照實際的狀況, 我們會同時用 檔案 與 資料庫 來記錄這些流程 底下的五大步驟, 前三項都會用文字檔做記錄, 因為這些小資料是自己 Debug( 除錯 ) 用的, 往往是系統出問題才會去察看, 也不太有保留的價值, 所以我們採用文字檔來記錄 1. 程式定時啟動 ( 例如 : 每五分鐘啟動一次 ), 並開始記錄處理流程 2. 從資料庫搜尋資料 符合條件的紀錄就撈出來, 組合成 XML 檔案 ( 執行時間與 XML 檔案都會存成文字檔, 存在專有的目錄底下 ) 3. 將 XML 檔案, 轉換成 Rosettanet 格式 ( 執行時間與 Rosettanet XML 檔案都會存檔, 放在專有的目錄底下 ) 4. 交給 Server 準備發送 此時, 就會用資料表來記錄時間與相關資料了 5. 傳送給對方的 Server 對方收到後, 我們也會把時間記錄在資料表裡面 註解 : 後面兩個流程要用資料表來做紀錄, 是為了給客戶與主管查驗, 日後也能統計與分析我們這套 B2B 系統的發送成功率等等 ( 關於上面的敘述, 讀者可以參考本章的 Case Study(II) 介紹的範例 類似的功能, 有異曲同工之妙 ) 除了大型的系統 複雜的程序需要做 Log 紀錄檔之外, 網站常用的 訪客計數器, 也可以用檔案的方式來控管 可見存取檔案的用法, 真的很多樣化

ASP.NET 4.0 專題實務 I 17-1 System.IO 命名空間 要使用檔案, 務必在程式上方宣告 System.IO 命名空間 (Namespace) 如果用在 Inline Code( 把程式跟 HTML 寫在同一個.aspx 檔裡面 ), 必須寫成 : <%@ Page Language=... %> <%@ Import NameSpace = "System.IO" %> 如果用在 Code Behind(HTML 與程式各自獨立, 是兩個不同的檔案 ), 就要在後置程 式碼的第一行寫上 : Imports System.IO Using System.IO '-- 註解,VB 的寫法 // 註解,C# 的寫法 System.IO 命名空間包含對檔案和資料流 (Stream) 進行讀取和寫入的型別, 以及提供基 本檔案和目錄支援的型別 我們先來看看 System.IO 命名空間的各種類別 : System.IO 命名空間的類別 BinaryReader BinaryWriter BufferedStream Directory DirectoryInfo DirectoryNotFoundException DriveInfo DriveNotFoundException EndOfStreamException ErrorEventArgs File FileInfo FileLoadException FileNotFoundException FileStream 說明 ( 下面的動作, 都是針對 Server 端電腦內的檔案 無法針對 Client 端的電腦作處理 ) 以特定的編碼方式, 將基本資料型別當做二進位值讀取 以二進位方式將基本型別 (Primitive Type) 寫入資料流, 並支援以 特定編碼方式寫入字串 將緩衝層加入另一資料流上的讀取和寫入作業 這個類別無法被 繼承 公開建立 移動和全面列舉目錄和子目錄的靜態方法 這個類別 無法被繼承 公開建立 移動和全面列舉目錄和子目錄的執行個體 (Instance) 方法 這個類別無法被繼承 找不到檔案或目錄的一部分時所擲回的例外狀況 提供對磁碟上資訊的存取 在嘗試存取不可用之磁碟或共用時擲回的例外狀況 嘗試超過資料流末端進行讀取時所擲回的例外狀況 提供 Error 事件的資料 提供建立 複製 刪除 移動和開啟檔案的靜態方法, 並協助 FileStream 物件的建立 提供建立 複製 刪除 移動和開啟檔案的執行個體 (Instance) 方法, 並協助 FileStream 物件的建立 這個類別無法被繼承 找到 Managed 組件但是無法載入時, 所擲回的例外狀況 嘗試存取不存在於磁碟上的檔案失敗時所擲回的例外狀況 公開檔案 Stream, 同時支援同步及非同步的 (Asynchronous) 讀取 和寫入作業 FileSystemEventArgs 提供資料給目錄事件 :Changed Created Deleted FileSystemInfo 為 FileInfo 和 DirectoryInfo 物件提供基底類別 17-2

資料流 I/O 與檔案 17 System.IO 命名空間的類別 FileSystemWatcher InternalBufferOverflowException InvalidDataException IODescriptionAttribute IOException MemoryStream Path PathTooLongException RenamedEventArgs Stream 說明 ( 下面的動作, 都是針對 Server 端電腦內的檔案 無法針對 Client 端的電腦作處理 ) 當目錄或目錄內的檔案變更時, 接聽 (Listen) 檔案系統變更告知 並引發事件 在內部緩衝區溢位時擲回的例外狀況 資料流在格式無效時擲回的例外狀況 設定視覺化設計工具 (Visual Designer) 在參考事件 擴充項 (Extender) 或屬性時可以顯示的描述 當 I/O 錯誤發生時所擲回的例外狀況 可以用 Try End Try 區塊 來接住這些例外狀況, 例如 :Catch ex As IOException 建立支援的存放區為記憶體的資料流 執行含有 檔案或目錄路徑資訊 的 String 執行個體 (Instance) 上的作業 這些作業是以跨平台方式來執行的 在路徑名稱或檔案名稱的長度大於系統定義的最大長度時, 會擲 回這個例外狀況 提供 Renamed 事件的資料 提供位元組順序的一般觀點 StreamReader 實作以特定的編碼方式自位元組資料流讀取字元的 TextReader StreamWriter 實作以特定的編碼方式將字元寫入位元組資料流的 TextWriter StringReader 實作讀取字串的 TextReader StringWriter 實作 TextWriter 以便將資訊寫入字串 資訊儲存在基礎 StringBuilder 中 TextReader 代表可以讀取一連串連續字元的讀取器 (Reader) TextWriter UnmanagedMemoryStream S 資料來源 : 微軟 MSDN 網站 表示可以寫入一連串連續字元的寫入器, 這個類別是抽象的 從 Managed 程式碼對 Unmanaged 記憶體區塊提供存取 17-2 Stream, 寫入與讀取檔案 StreamWriter 方法在衍生類別中覆寫時, 將一連串的 位元組 寫入目前的資料流, 並 且由這個資料流中目前的位置前移寫入的位元組數目 命名空間 : System.IO 組件 : mscorlib ( 在 mscorlib.dll 中 ) 17-2-1 StreamWriter, 寫入檔案 第一個範例 ( 檔名 File_1.aspx) 會示範如何將文字寫入現有的檔案 (C:\MIS2000Lab_ TestFile.txt) 中 範例 File_1.aspx 的後置程式碼 : http://www.dotblogs.com.tw.mis2000lab/ 17-3

ASP.NET 4.0 專題實務 I Imports System.IO '== 別忘了寫喔! == Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System. EventArgs) Handles Button1.Click '==== 將文字寫入現有的檔案 (TestFile.txt) 中 ==== Using sw As StreamWriter = New StreamWriter("C:\MIS2000Lab_TestFile.txt") sw.write(" 大家好,") sw.writeline(" 這是一段測試文字! ") '-- 註解 :.WriteLine 方法會自動換行 sw.writeline("================") sw.write("the date is: ") sw.writeline(datetime.now) '-- 註解 : 寫入目前的系統時間 sw.close() sw.dispose() End Using End Sub 程式完成後, 我們可以看看 C:\ 底下真的出現 MIS2000Lab_TestFile.txt 這個檔案了, 檔案 內容是 : 大家好, 這是一段測試文字! ================ The date is: 2010/4/26 上午 10:56:23 如果是 Winodws VISTA 7 或 2008 Server, 因為他們的安全要求較高, 如果要把檔案存 放在 C:\ 底下, 有時可能會存取失敗 ( 不允許寫入 ), 請您自行更換其他目錄來存放上述 程式產生的文字檔 17-2-2 檢查檔名是否存在? 並建立新的檔案 第二個範例 ( 範例 File_2.aspx) 則會示範如何建立新的文字檔, 並將字串寫入到 C:\ MIS2000Lab_TestFile2.txt 檔案中 後置程式碼如下 : Imports System.IO '== 別忘了寫喔! == Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System. EventArgs) Handles Button1.Click If File.Exists("C:\MIS2000Lab_TestFile2.txt") Then '-- 註解 : 先檢查一下, 看看這個檔案是否存在? '-- File.Exists() 方法不用於路徑驗證, 此方法僅會檢查指定的 " 檔案 " 是否存在 Response.Write("*** C:\MIS2000Lab_TestFile2.txt 檔案的確存在! ***") Return '-- 註解 : 檔案已經存在, 就不會執行下面的寫入動作 17-4

資料流 I/O 與檔案 17 End If End Sub Using sw As StreamWriter = File.CreateText ("C:\MIS2000Lab_TestFile2.txt") sw.writeline("c:\mis2000lab_testfile2.txt") sw.writeline("===================") sw.writeline(" 寫入一個整數 {0}, 然後再寫入一個浮點數 {1}... 完成了, 掰掰! ", 1, 4.2) sw.writeline("===================") sw.write("the date is: ") sw.writeline("{0:yyyy/mm/dd}", DateTime.Now) '-- 註解 : 日期格式化 sw.close() sw.dispose() '-- 註解 : 因為使用 Using 區塊, 會自動關閉資源, 所以 sw.dispose() 這一行不寫也行 End Using '-- 註解 : 關於 File 的各種方法, 下一節會進行介紹 程式完成後, 我們可以看看 C:\ 底下真的出現 MIS2000Lab_TestFile2.txt 這個檔案了, 檔案內容是 : C:\MIS2000Lab_TestFile2.txt =================== 寫入一個整數 1, 然後再寫入一個浮點數 4.2... 完成了, 掰掰! =================== The date is: 2010/04/26 不過, 如果您重複執行 File_2.aspx 這支程式, 第二次以後將不會再去寫入此檔案 因為 我們有一個 If 判別式 (If File.Exists("C:\MIS2000Lab_TestFile2.txt") Then) 進行阻 擋, 如果這個檔名已經存在, 就不會再作一次了 17-2-3 StreamReader, 讀取檔案 關於讀取檔案, 各位也可以參考範例 File_3.aspx 這段程式碼, 是改用 Do Loop 迴圈來 讀取檔案內容的 Using sr As StreamReader = New StreamReader("C:\MIS2000Lab_TestFile2.txt ") Dim my_line As String Do my_line = sr.readline() '-- 註解 : 一次讀取一行 Response.Write(my_line & "<br>") Loop Until my_line Is Nothing sr.close() sr.dispose() End Using http://www.dotblogs.com.tw.mis2000lab/ 17-5

ASP.NET 4.0 專題實務 I S File_3.aspx 執行結果 透過 Do Loop 迴圈來讀取檔案內容 17-3 File 類別, 處理檔案的靜態方法 上一個範例裡面, 我們用到 File.Exits() 與 File.CreateText() 這兩種方法, 這一節將會稍微 介紹一下 File 類別 File 類別是用來提供建立 複製 刪除 移動和開啟 Server 端檔案的靜態方法, 並協 助 FileStream 物件的建立 從下表可以發現 File 類別有許多公用的方法, 除了可以處理 Server 端的檔案之外, 也可以獲得檔案的屬性 日期 容量大小等等 命名空間 : System.IO 組件 :mscorlib ( 在 mscorlib.dll 中 ) File 公用方法的名稱 AppendAllText AppendText Copy Create CreateText Decrypt Delete Encrypt Equals Exists GetAccessControl GetAttributes 說明 ( 下面的動作, 都是針對 Server 端電腦內的檔案 無法針對 Client 端的電腦作處理 ) 將指定字串附加至檔案, 如果檔案不存在, 請建立一個新檔案 所謂的 附加 (Append), 表示新的資料都會加到檔案的末端 建立 會附加 UTF-8 編碼的文字至現有檔案 的 StreamWriter 所謂的 附加 (Append), 表示新的資料都會加到檔案的末端 複製現有的檔案到新的檔案 在指定路徑中建立檔案 建立或開啟用以寫入 UTF-8 編碼文字的檔案 解密目前帳戶使用 Encrypt 方法加密的檔案 刪除指定的檔案 例外狀況不會被擲回, 如果指定檔案不存在的話 加密檔案, 只有使用加密檔案的帳戶才能將其解密 判斷兩個 Object 執行個體是否相等 判斷指定的檔案是否存在 取得 FileSecurity 物件, 該物件封裝指定檔案的存取控制清單 (ACL) 項目 取得路徑上檔案的檔案屬性 17-6

資料流 I/O 與檔案 17 File 公用方法的名稱 GetCreationTime GetCreationTimeUtc GetHashCode GetLastAccessTime GetLastAccessTimeUtc GetLastWriteTime GetLastWriteTimeUtc 說明 ( 下面的動作, 都是針對 Server 端電腦內的檔案 無法針對 Client 端的電腦作處理 ) 傳回指定檔案或目錄的建立日期和時間 傳回指定檔案或目錄的建立日期和時間, 格式為 Coordinated Universal Time (UTC) 做為特定型別的雜湊函式 GetHashCode 很適合用在雜湊演算法和資料結 構中 ( 例如雜湊資料表 ) 傳回指定檔案或目錄, 上次被存取的日期和時間 傳回指定檔案或目錄上次被存取的日期和時間, 格式為 Coordinated Universal Time (UTC) 傳回指定檔案或目錄, 上次被寫入的日期和時間 傳回指定檔案或目錄上次被寫入的日期和時間, 格式為 Coordinated Universal Time (UTC) GetType 取得目前執行個體的 Type Move 移動指定的檔案至新的位置, 提供指定新檔名的選項 Open 在指定路徑上開啟 FileStream OpenRead OpenText OpenWrite ReadAllBytes ReadAllLines ReadAllText ReferenceEquals Replace SetAccessControl 開啟現有檔案來讀取 開啟現有 UTF-8 編碼的文字檔來讀取 開啟現有檔案來寫入 開啟二進位檔案, 將檔案內容讀入 " 位元組陣列 ", 然後關閉檔案 開啟文字檔, 將檔案的所有行讀入 " 字串陣列 ", 然後關閉檔案 開啟文字檔, 將檔案的所有行讀入 " 字串 ", 然後關閉檔案 判斷指定的 Object 執行個體是否為相同的執行個體 用另一個檔案的內容 " 取代 " 指定檔案的內容, 刪除原始檔案並建立已取 代檔案的備份 將 FileSecurity 物件描述的存取控制清單 (ACL) 項目套用至指定的檔案 SetAttributes 在指定路徑上設定檔案的指定 FileAttributes SetCreationTime 設定檔案建立的日期和時間 SetCreationTimeUtc 設定檔案被建立的日期和時間, 格式為 Coordinated Universal Time (UTC) SetLastAccessTime SetLastAccessTimeUtc SetLastWriteTime SetLastWriteTimeUtc WriteAllBytes WriteAllLines 取得指定檔案上一次被存取的日期和時間 設定指定檔案上次被存取的日期和時間, 格式為 Coordinated Universal Time (UTC) 設定指定檔案上次被寫入的日期和時間 設定指定檔案上次寫入的日期和時間, 格式為 Coordinated Universal Time (UTC) 建立新檔案, 將指定的 " 位元組陣列 " 寫入檔案, 然後關閉檔案 如果檔 案已經存在, 則會覆寫該檔案 建立新檔案, 將指定的 " 字串 " 寫入檔案, 然後關閉檔案 如果檔案已經 存在, 則會覆寫該檔案 WriteAllText 建立新檔案, 將 " 內容 " 寫入檔案, 然後關閉檔案 如果檔案已經存在, S 資料來源 : 微軟 MSDN 網站 則會覆寫該檔案 17-7 http://www.dotblogs.com.tw.mis2000lab/

ASP.NET 4.0 專題實務 I 各位可以發現上表提到的東西雖多, 但有規則可循 : 1. 關於檔案被建立 ( 存取 ) 時間, 分成一般日期與 UTC 日期兩種 2. 讀取或是寫入檔案, 分成三種 也就是 AllBytes AllLines 與 AllText 三種 3. 其餘的就是檔案的處理動作, 例如 : 建立 (Create) 開啟 (Open) 複製 (Copy) 刪除 (Delete) 取代(Replace) 或是加解密等等動作 File 與 FileStream 兩者的使用上互為表裡, 關係很緊密 後續將會介紹 FileStream 類別 17-3-1 開啟 複製 刪除檔案 關於檔案的開啟 複製 刪除等等, 我們可以參考下面的程式碼, 把 Path1 路徑的檔案, 進行 讀取 複製 到 Path2, 然後再做 刪除 的動作 程式很簡單, 請您自行參閱即可 Imports System.IO '============= Dim path1 As String = "c:\temp\mytest.txt" If File.Exists(path1) = False Then '-- 註解 : 如果檔案不存在, 就新增一個檔案 Dim sw As StreamWriter = File.CreateText(path1) sw.writeline(" 讀者你好 ") sw.writeline(" 歡迎來到 ") sw.writeline("== 本範例 ==") sw.flush() '-- 註解 :Flush 方法可用來清除任何內部緩衝區, 並確認所有資料都已寫入 sw.close() End If Try ' 註解 : 開始讀取檔案 Dim sr As StreamReader = File.OpenText(path1) Do While sr.peek() >= 0 '-- 註解 :.Peek() 是用來尋找下一個字元 Response.Write(sr.ReadLine()) Loop sr.close() Dim path2 As String = path1 & "temp" File.Delete(path2) '-- 註解 : 先刪除清空, 以確保 Path2 沒有檔案 File.Copy(path1, path2) Response.Write(" 已經把 Path1 的檔案,Copy 到 Path2 了! ") '-- 這一段先註解掉, 先檢查看看上面的 Copy 動作有無成功? '-- 如果成功了, 把下面兩行的註解去掉, 試試看, 刪除的動作有無成功 17-8

資料流 I/O 與檔案 17 '-- File.Delete(path2) '-- Response.Write("Path2 的檔案已經被刪除! ") Catch e As Exception Response.Write(" 本程式在執行中, 有哪些錯誤訊息發生?..." & e.tostring()) End Try 這個範例可以分成兩次來執行 第一次, 只作 copy 的動作, 先把 File.Delete(path2) 那兩行註解掉 不執行 第二次, 啟動 File.Delete(path2) 那兩行, 看看.Delete() 的動作能否運作? 17-3-2 附加 (Append) 資料至檔案末端 StreamWriter 和 StreamReader 會對資料流寫入和讀取字元 下列程式碼 ( 範例 File_ Append.aspx) 開啟輸入的 C:\ MIS2000Lab_TestFile.txt 檔案 ( 如果檔案不存在的話, 將會建立檔案 ), 並以附加 (Append) 的方式, 把新資料附加至原有檔案的 " 末端 ( 結尾 )" 範例 File_Append.aspx 的後置程式碼如下 : S 執行成果 將新的內容, 附加到文字檔的後端 Imports System.IO '============= Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load '-- 檢查同名的檔案是否存在? If File.Exists("C:\temp\MIS2000Lab_TestFile.txt") Then Response.Write(" 此檔案已經存在.") Return '-- 程式暫停 離開 End If http://www.dotblogs.com.tw.mis2000lab/ 17-9

ASP.NET 4.0 專題實務 I End Sub Using w As StreamWriter = _ File.AppendText("C:\MIS2000Lab_TestFile.txt") Log("Test1", w) ' Log 是自己寫的副程式, 如下 Log("Test2", w) w.close() End Using Public Shared Sub Log(ByVal logmessage As String, ByVal w As TextWriter) w.write(controlchars.crlf & "Log Entry : ") w.writeline("{0} {1}", DateTime.Now.ToLongTimeString(), DateTime.Now. ToLongDateString()) w.writeline(" :") w.writeline(" :{0}", logmessage) w.writeline("-------------------------------") End Sub w.flush() ' 資料全數寫入 Stream StreamWriter 是為使用特定編碼方式的字元輸出所設計, 預設為 UTF-8 編碼 StreamWriter 的方法 說明 Close 關閉目前的 StreamWriter 物件和基礎資料流 CreateObjRef 建立包含所有相關資訊的物件, 這些資訊是產生用來與遠端物件通訊的所 需 Proxy Equals 判斷兩個 Object 執行個體是否相等 Flush 清除目前寫入器 (Writer) 的所有緩衝區, 並且造成任何緩衝資料都寫入基 礎資料流 GetHashCode 做為特定型別的雜湊函式 GetHashCode 很適合用在雜湊演算法和資料結 構中 ( 例如雜湊資料表 ) GetLifetimeService 擷取控制這個執行個體存留期 (Lifetime) 原則的目前存留期服務物件 GetType 取得目前執行個體的 Type InitializeLifetimeService 取得存留期服務物件來控制這個執行個體的存留期原則 ReferenceEquals 判斷指定的 Object 執行個體是否為相同的執行個體 Synchronized 在指定 TextWriter 內建立安全執行緒的包裝函式 Write 寫入資料流 WriteLine 撰寫多載參數所指定的一些資料, 並加上行結束字元 ( 自動分段落 換一 列 ) S 資料來源 : 微軟 MSDN 網站 17-10

資料流 I/O 與檔案 17 17-3-3 FileInfo, 檔案名稱與容量大小 下一個範例 ( 檔名 File_Dir.aspx), 是用來讀取電腦 (Server 端 )C:\ 底下的所有檔案與檔 案的容量大小 Imports System.IO '============= Dim my_dir As New DirectoryInfo("C:\") Dim fi_array As FileInfo() = my_dir.getfiles() Dim fi As FileInfo '-- 註解 : 個別的檔案 '-- 註解 : 陣列 Response.Write(" 電腦 C:\ " & my_dir.name) For Each fi In fi_array Response.Write(" 檔案 :" & fi.name) Response.Write("---- 大小 :" & fi.length & "<br>") Next S 圖 File_01 範例的執行結果 列出 Server 端電腦 C:\ 底下所有檔案與檔案的容量大小 關於 FileInfo 的其他用法與屬性, 可以參考下面的表格 FileInfo 的屬性名稱 說明 ( 下面的動作, 都是針對 Server 端電腦內的檔案 無法針對 Client 端的電腦作處理 ) Attributes 取得或設定目前 FileSystemInfo 的 FileAttributes CreationTime CreationTimeUtc Directory 取得或設定目前 FileSystemInfo 物件的建立時間 取得或設定目前 FileSystemInfo 物件的建立時間, 其格式為 Coordinated Universal Time (UTC) 取得父 (Parent) 目錄 ( 上一層目錄 ) 的執行個體 http://www.dotblogs.com.tw.mis2000lab/ 17-11

ASP.NET 4.0 專題實務 I FileInfo 的屬性名稱 DirectoryName Exists Extension FullName IsReadOnly LastAccessTime LastAccessTimeUtc LastWriteTime LastWriteTimeUtc Length Name S 資料來源 : 微軟 MSDN 網站 說明 ( 下面的動作, 都是針對 Server 端電腦內的檔案 無法針對 Client 端的電腦作處理 ) 取得表示 " 目錄完整路徑 " 的字串 指出檔案是否存在 取得檔案的副檔名部分 取得目錄或檔案的完整路徑 判斷目前檔案是否為唯讀 取得或設定上次存取目前檔案或目錄的時間 取得或設定目前檔案或目錄上次被存取的時間, 其格式為 Coordinated Universal Time (UTC) 取得或設定上次寫入目前檔案或目錄的時間 取得或設定目前檔案或目錄上次被寫入的時間, 其格式為 Coordinated Universal Time (UTC) 取得目前檔案的大小 取得檔案的名稱 17-3-4 設定與取得檔案屬性 檔案屬性的設定與擷取, 有下列兩種方法 : File.SetAttributes() 方法, 在指定路徑上設定檔案的指定 FileAttributes( 檔案屬性 ) File.GetAttributes() 方法, 取得路徑上檔案的 FileAttributes( 檔案屬性 ) Imports System.IO Imports System.Text '============= Dim path As String = "c:\temp\mytest.txt" '-- 檢查同名的檔案是否存在? If File.Exists(path) = False Then File.Create(path) End If '-- File.GetAttributes() 方法,[ 取得 ] 路徑上檔案的檔案屬性 If (File.GetAttributes(path) And FileAttributes.Hidden) = FileAttributes.Hidden Then File.SetAttributes(path, FileAttributes.Archive) ' [ 設定 ] 檔案屬性為 Archive, 看得見 Console.WriteLine("The {0} file is no longer hidden.", path) Else File.SetAttributes(path, File.GetAttributes(path) Or FileAttributes. Hidden) ' [ 設定 ] 檔案屬性為 Hidden, 隱藏 Console.WriteLine("The {0} file is now hidden.", path) End If 17-12

資料流 I/O 與檔案 17 17-4 Binary, 讀取和寫入二進位資料到檔案 這一節的範例, 其實跟前面差不多 從字面上來看, 就知道最大的差異是 : BinaryWriter 和 BinaryReader 類別被用來寫入和讀取資料, 是以 二進位 的方式, 而非字元字串 下面的範例 File_Binary.aspx 將對新的空白檔案 ( 檔名 MIS2000Lab_TestFile_3.txt) 寫入和讀取二進位的資料 本範例建立一個檔案之後, 並使用 BinaryWriter 將 0 至 10 的整數, 以二進位的方式寫入到此檔案中, 使檔案指標停留在檔案結尾 然後, 將檔案指標設定回起點後, BinaryReader 會讀出指定的內容 Imports System.IO Partial Class _Book_My_Files_File_3 Inherits System.Web.UI.Page Private Const FILE_NAME As String = "C:\MIS2000Lab_TestFile3.txt" Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System. EventArgs) Handles Button1.Click Dim fs As FileStream Try If File.Exists(FILE_NAME) Then '-- 註解 : 先檢查一下, 看看這個檔案是否存在? Response.Write("*** C:\MIS2000Lab_TestFile3.txt 檔案的確存在! ***<hr>") End If '-- 註解 : 寫入資料 --------------------------------- '-- FileMode 的各種用法請看下一節的介紹 fs = New FileStream(FILE_NAME, FileMode.CreateNew) Dim bw As New BinaryWriter(fs) Dim i As Integer For i = 0 To 10 bw.write(i) Next bw.close() fs.close() Catch ex As IOException Response.Write("<br>" & ex.gettype().name) Response.Write(" " & ex.message.tostring) Response.Write("<br>") '-- 註解 : 設定 FileMode.CreateNew 時, 檔案已經存在, 就會拋出例外狀況, IOException http://www.dotblogs.com.tw.mis2000lab/ 17-13

ASP.NET 4.0 專題實務 I Finally '-- 註解 : 讀取資料 --------------------------------- '-- FileMode 與 FileAccess 的各種用法, 請看下一節的介紹 fs = New FileStream(FILE_NAME, FileMode.Open, FileAccess.Read) Dim br As New BinaryReader(fs) Response.Write("C:\MIS2000Lab_TestFile3.txt 檔案的內容 ----<br>") For i = 0 To 10 Response.Write(br.ReadInt32() & "<br>") Next br.close() fs.close() fs.dispose() '-- 程式的最後, 請確定對所有 FileStream 物件呼叫.Dispose() 方法 End Try End Sub End Class ' 註解 : 關於 FileStream 類別 FileMode 與 FileAccess 這三者, 下一節會有詳細的介紹 S 程式執行結果 檔案 (MIS2000Lab_TestFile_3.txt) 內容是二進位 我們用兩種文字編輯器打開此檔案, 看看二進位的內容是什麼 上面的程式採用 FileMode.CreateNew 來寫入檔案, 如果檔案已經存在於目前目錄中, 則會擲回 IOException, 我們可以用 Try End Try 區塊來接住這些例外狀況, 例如 :Catch ex As IOException 17-14

資料流 I/O 與檔案 17 S 如果檔案 (MIS2000Lab_TestFile_3.txt) 已經存在, 就會拋出例外狀況的訊息, 例如 :Catch ex As IOException 如果改用 FileMode.Create 的話, 寫入檔案時就一定會建立新檔案 ( 若檔案已經存在, 則覆寫原本的檔案 ), 且不會擲回 IOException 寫法如下: fs = New FileStream(FILE_NAME, FileMode.Create) FileMode.Create 用起來是比上面程式的 FileMode.CreateNew 更單純方便 關於 FileStream 與 FileMode 的用法, 我們在下一節會詳細說明 17-5 FileStream 類別 FileMode 與 FileAccess 17-5-1 FileStream 類別 FileStream 類別, 是用來公開檔案 Stream, 同時支援同步及非同步的 (Asynchronous) 讀 取和寫入作業 命名空間 : System.IO 組件 : mscorlib ( 在 mscorlib.dll 中 ) FileStream 預設是要以 " 同步 " 方式開啟檔案, 但也提供 FileStream(String,FileMode, FileAccess,FileShare,Int32,Boolean) 建構函式以 " 非同步 " 方式開啟檔案 請特別注意資 源的關閉, 如下面兩點 : http://www.dotblogs.com.tw.mis2000lab/ 17-15

ASP.NET 4.0 專題實務 I 程式的最後, 請確定對所有 FileStream 物件呼叫.Dispose() 方法, 尤其是在磁碟空間 有限的環境中更應如此 如果沒有可用的磁碟空間, 且在 FileStream 完成之前沒有呼叫.Dispose() 方法, 則執行 I/O 作業可能會引發例外狀況 使用 Using 區塊來寫程式, 可以幫助我們處理.Dispose() 的資源處理 17-5-2 FileMode 與 FileAccess 上一節的範例, 有提到 FileStream 與 FileMode 我們將在下面兩個表格中為各位介紹 FileMode 是用來指定作業系統應該如何開啟檔案, 關於 FileMode 列舉型別 (Enumeration) 的各種成員, 請看下面列表 : FileMode 成員名稱 Append Create CreateNew Open OpenOrCreate Truncate 說明 ( 下面的動作, 都是針對 Server 端電腦內的檔案 無法針對 Client 端的電腦作處理 ) 在檔案存在時, 開啟它並搜尋至檔案末端, 或建立新檔案 FileMode.Append 只能與 FileAccess.Write 搭配使用 任何嘗試讀取失敗將擲回 ArgumentException 指定作業系統應該建立新檔案 如果檔案已經存在, 將覆寫此檔案, 且不會擲回 IOException 此舉會用到 FileIOPermissionAccess.Write System.IO.FileMode.Create 就是說 當檔案 " 不 " 存在時, 改用 CreateNew, 否則使用 Truncate 的意思 指定作業系統應該建立新檔案 這需要 FileIOPermissionAccess.Write 如果檔案已經 存在, 將會擲回 IOException 指定作業系統應該開啟現有的檔案 開啟檔案的能力取決於 FileAccess 所指定的值 如果檔案 " 不 " 存在, 會擲回 System.IO.FileNotFoundException 指定作業系統, 如果檔案存在應該開啟檔案, 否則, 應該建立新的檔案 如果檔案以 FileAccess.Read 開啟, 則需要 FileIOPermissionAccess.Read 如果檔案存取方式是 FileAccess.Write 或 FileAccess.ReadWrite, 則需要 FileIOPermissionAccess.Write 如果檔案存取方式是 FileAccess.Append, 則需要 FileIOPermissionAccess.Append 指定作業系統應該開啟現有的檔案 一旦開啟, 應該截斷檔案, 使檔案的容量大小 為 零 個位元組 這需要 FileIOPermissionAccess.Write 嘗試讀取以 Truncate 開啟 的檔案會導致例外狀況 (Exception) S 資料來源 : 微軟 MSDN 網站 FileAccess 的成員名稱 Read ReadWrite Write 說明檔案的讀取權限, 資料可以從檔案讀取, 與讀 / 寫存取的 Write 結合 讀取和寫入檔案的存取權限, 資料可以寫入檔案和從檔案讀取 寫入檔案的存取權限, 資料可以寫入檔案, 與讀 / 寫存取的 Read 結合 S 資料來源 : 微軟 MSDN 網站 17-16