在.NET Framework 中. System.IO 命名空間主要包含基於文件(和基於內存)的輸入輸出(I/O)服務的相關基礎類庫.和其他命名空間一樣. System.IO 定義了一系列類、接口、枚舉、結構和委托。
它們大多數包含在 mscorlib.dll! 另外有一部分部分 System.IO 命名空間的成員則包含在systcm.dll程序集中。
System.IO命名空間的多數類型主要用於編程操作物理目錄和文件,而另一些類型則提供了從字符串緩沖區和內存區域中讀寫數據的方法。
下面是有關System.IO命名空間的主要成員
System.IO命名空間的主要成員 | |
非抽象I/O類類型 | 作用 |
BinaryReader和BinaryWriter | 這兩個類型能夠以二進制值存儲和讀取基本數據(整型,布爾型,字符串型和其他類型) |
BufferedStream | 這個類型為字節流提供了臨時的存儲空間,可以以以后提交 |
Directory和DirectoryInfo | 這兩個類型用來操作計算機的目錄結構。Directory 類型主要的功能通過靜態方法實現。 DirectoryInfo 類創剛通過一個有效的時象引用來實現類似功能 |
DriveInfo | 提供計算機驅動器的詳細信息 |
File 和 FlleInfo | 這兩個類用來操作計算機上的一組文件。Fi1e類型主要的功能通過靜態成員實現。FlleInfo類型則通過一個有效的對象引用來實現類似功能 |
FileStream | 這個類型實現文件隨記訪問(比如尋址能力)以字節流來表示教據 |
FileSystemWatcher | 這個類型監控對指定外部文件的更改 |
MemoryStream | 這個類型實現對內存(而不是物理文件)中存儲的流教據的隨機訪問 |
Path | 這個類型對包含文件或目錄路徑信息的System.Stream類型執行操作。這些操作是與平台無關的 |
StreamWriter和StreamReader | 這兩個類型用來在(從)文件中存儲(獲取)文本信息。不支持隨機文件訪問 |
StringWriter和StringReader | 和StreamWriter/StreamReader類型差不多.這兩個類型同樣同文本信息打交道,不同的是基層的存儲器是字符串緩沖區而不是物理文件 |
Directory(Info)和File(Info) 類型 實現單個文件和計算機目錄操作
一般說來, Fllelnfo 和DirectoryInfo 是獲取文件或目錄細節(如創建時間、讀寫能力等)更好的方式,因為它們的成員往往會返回強類型的對象。相反,Directory 和File類成員往往會返回簡單字符串值而不是強類型對象。不過.這僅僅是一個准則。在很多情況下,你都可以使用 File/FileInfo或Directory/DirectoryInfo 完成相同的工作
Filesystemlnfo 抽象基類
DirectoryInfo 和 FlleInfo 類型實現了許多FilesystemInfo 抽象基類的行為。大部分 FllesystemInfo類成員的作用是用來獲取指定文件或目錄的一般特性(比如創建時間、各種特性等)。
FilesystemInfo 屬性
FllesystemInfo 屬性 | |
屬性 | 作用 |
Attributes | 獲取或設置與當前文件關聯的特性.由 FlleAttrlbutes 枚舉表示(例如.是只讀、加密、隱藏或壓縮文件或目錄) |
CreationTime | 獲取或設置當前文件或目錄的創建時間 |
Exists | 用來判斷指定文件或目錄是否存在的值 |
Extension | 獲取文件的擴展名 |
FullName | 獲取目錄或文件的完整路徑 |
LastAccessTime | 獲取或設置上次訪問當前文件或目錄的時間 |
LastWriteTime | 獲取或設置上次寫人當前文件或目錄的時間 |
Name | Name 獲取當前文件或目錄的名稱 |
FilesystemInfo 類型還定義了Delete()方法,該操作由派生類型從硬盤中刪除指定文件或目錄來實現。同樣,在獲取文件特性前使用Refresh()方法能確保當前文件(或目錄)的統計信息是最新的。
使用Directoryinfo類型
DirectoryInfo類包含一組用來創建、移動,刪除和枚舉所有目錄/子目錄的成員
DirectoryInfo類型的主要成員 | |
成員 | 操作 |
Create()和CreateSubdirectory() | 按照路徑名建立一個目錄(或者一組子目錄) |
Delete() | 刪除一個目錄和它的所有內容 |
GetDirectories() | 返回一個表示當前目錄中所有子目錄的DirectoryInfo對象數組 |
GetFiles() | 返回Filelnfo對象教組,表示指定目錄下的一組文件 |
MoveTo() | 將一個目錄及其內容移動到一個新的路徑 |
Parent | 獲取指定路徑的父目錄 |
Root | 獲取路徑的根部分 |
獲取DirectoryInfo 的屬性代碼如下
DirectoryInfo dir1 = new DirectoryInfo("."); //綁定當前的應用程序目錄 DirectoryInfo dir2 = new DirectoryInfo(@"D:\360Downloads");//使用存在的目錄 //如果試圖使用一個不存在的目錄.系統會引發System.IO.DirectoryNOtFoundExceptlon 異常。因此,如果指定了一個尚未創建的目錄的話,在對目錄進行操作前首先需要調用Create()方法。 DirectoryInfo dir3 = new DirectoryInfo(@"D:\360Downloads\dir2"); dir3.Create(); Console.WriteLine("DirectoryInfo 主要成員的實現"); Console.WriteLine("FullName:{0}", dir3.FullName); Console.WriteLine("Name:{0}", dir3.Name); Console.WriteLine("Parent:{0}", dir3.Parent); Console.WriteLine("CreationTime:{0}", dir3.CreationTime); Console.WriteLine("Attributes:{0}", dir3.Attributes); Console.WriteLine("Root:{0}", dir3.Root);
使用DirectoryInfo 類型枚舉出文件
DirectoryInfo dir = new DirectoryInfo(@"C:\Users\Public\Pictures"); FileInfo[] imageFiles = dir.GetFiles("*.jpg", SearchOption.AllDirectories); foreach (FileInfo f in imageFiles) { Console.WriteLine("********************"); Console.WriteLine("file Name:{0}", f.Name); Console.WriteLine("file Length:{0}", f.Length); Console.WriteLine("file CreationTime:{0}", f.CreationTime); Console.WriteLine("file Attributes:{0}", f.Attributes); Console.WriteLine("********************"); }
使用DirectoryInfo類型創建子目錄
DirectoryInfo dir = new DirectoryInfo(@"D:\360Downloads\dir2"); dir.CreateSubdirectory("MyFolder"); //盡骨不一定要去捕獲 CreateSubdirectory()方法的返回值,但是需要知道的是.如果執行成功.它會返回DirectoryInfo類型 DirectoryInfo dir1=dir.CreateSubdirectory(@"MyFolser2\Data"); Console.WriteLine("New Foloser:{0}",dir1);
使用Directory類型
Directory的靜態成員實現了由DirectoryInfo定義的實例級成員的大部分功能。 Directory成員返回的是字符串數據而不是強類型的Filelnfo 和 DirectoryInfo對象。
獲取此計算機上的邏輯驅動器代碼如下:
string[] dives = Directory.GetLogicalDrives(); Console.WriteLine("Here are your drives:"); foreach (string s in dives) { Console.WriteLine("------->{0}", s); }
刪除之前建立的目錄代碼如下
try { Directory.Delete(@"D:\360Downloads\dir2\MyFolser2\Data"); } catch (IOException e) { Console.WriteLine(e.Message); }
使用DriveInfo類類型
System.IO命名空間提供了一個叫做Drivelnfo的類。和Drivelnfo.GetLogicalDrivers()相似.Drlvelnfo.GetDrives()靜態方法能獲取計算機上驅動器的名字。然而和Drlvelnfo.GetDrives()不同,Drlvelnfo提供了許多其他的細節(比如驅動器類型、可用空間、卷標等)。
得到所有驅動器的信息代碼如下
DriveInfo[] myDivers = DriveInfo.GetDrives(); foreach (DriveInfo d in myDivers) { Console.WriteLine("Name:{0}", d.Name); Console.WriteLine("Type:{0}", d.DriveType); //檢查驅動器是否已經安裝好 if (d.IsReady) { Console.WriteLine("Free space:{0}", d.TotalFreeSpace); Console.WriteLine("Format space:{0}", d.DriveFormat); Console.WriteLine("Lable space:{0}", d.VolumeLabel); } Console.WriteLine("***************************"); }
使用FileInfo類類型
FlleInfo 類能讓我們獲得硬盤上現有文件的詳細信息(創建時間,大小、文件特性等),並幫助我們創建、復制、移動和刪除除文件
刪除FileInfo實例綁定的文件
FileInfo 核心成員 | |
成員 | 作用 |
AppendText() | 創建一個StreamWriter類型(后面會討論),它用來向文件追加文本 |
CopyTo() | 將現有文件復制到新文件 |
Create() | 創建一個新文件並且返回一個FileStream類型(后面會討論).通過它來和新創建的文件進行交互 |
CreateText() | 創建一個寫入新文本文件的StreamWriter對象 |
Delete() | 刪除FileInfo實例綁定的文件 |
Directory | 獲取父目錄的實例 |
DirectoryName | 獲取父目錄的完整路徑 |
Length | 獲取當前文件的大小 |
MoveTo() | 將指定文件移到新位置.井提供指定新文件名的選項 |
Name | 獲取文件名 |
Open() | 用各種讀/寫訪問權限和共享特權打開文件 |
OpenRead() | 創建只讀FileStream對象 |
OpenText() | 創建從現有文本文件中讀取教據的StreamReade(后面會討論) |
OpenWrite() | 創建只寫FileStream類型 |
注意,大部分FileInfo類的成員返回I/O相關的特定對象(Filestream和StreamWriter),讓我們以不同格式從關聯文件讀或向關聯文件寫數據。
FileInfo.Create()的用法
FileInfo f = new FileInfo(@"D:\360Downloads\dir2\Test.txt"); FileStream fs = f.Create(); fs.Close();
需要注意的是,FlleInfo.Create()方法返一個FileStearm對象。FileStream能對基層的文件進行同步/異步的讀寫操作:需要知道的是,FileInfo.Create()返回的FileStream對象給所有的用戶授予完全讀寫操作權限.
還要注意,在使用了當前FileStream對象之后.要確保關閉句柄來釋放流的底層非托管資源。由於FileStream實現了IDisposable,所以我們可以使用C#的using域來讓編譯器生成釋放邏輯
FileInfo f1 = new FileInfo(@"D:\360Downloads\dir2\Test2.txt"); using (FileStream f2=f1.Create()) { }
FileInfo.Open() 方法
我們能使用FileInfo.Open()方法來打開現有文件.同時也能使用它來創建新文件,它比FileInfo.Create()多了很多細竹.因為open()通常有好幾個參數,可以限定所操作的文件的整體結構。一旦調用open()完成后.它返回一個FileStream對象。
FileInfo f = new FileInfo(@"D:\360Downloads\dir2\Test3.txt"); using (FileStream fs = f.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) { }
* 上面的重載 OPen()方法需要3個參數。
* 第一個參數指定I/O請求的基本方式(比如說新建文件、打開現有文件和追加文件等),它的值由FileMode
* 第二個參數的值由FileAccess枚舉定義,用來決定基層流的讀寫行為
* 第三個參數FileShare指定文件在其他文件處理程序中的共享方式。
FileInfo.OpenRead() 和FileInfo.OpenWrite()
FileInfo.Open()方法能讓我們用非常靈活的方式獲取文件句柄,FileInfo類同樣提供了OpenRead()和OpenWrite()成員。這些方法不需要提供各種枚舉值.就能返回一個正確配置的只讀或只寫的FileStream類型。 OPenRead()和OPenWrite()也都返回一個FileStream對象
FileInfo f = new FileInfo(@"D:\360Downloads\dir2\test.txt"); using (FileStream fs = f.OpenRead()) { Console.WriteLine("ok"); } FileInfo f4 = new FileInfo(@"D:\360Downloads\dir2\test4.txt"); using (FileStream fs1 = f4.OpenWrite()) { }
FileInfo.OpenText()
OpenText()方法返回的是一個StreamReader類型(而不是不是FileStream類型)的實例。
FileInfo f = new FileInfo(@"D:\360Downloads\dir2\Test3.txt"); using (StreamReader reader = f.OpenText()) { }
FileInfo.CreateText() 和 FileInfo.AppendText()
FileInfo.CreateText() 和 FileInfo.AppendText()都返回的是一個StreamWriter類型
FileInfo f = new FileInfo(@"D:\360Downloads\dir2\Test6.txt"); using (StreamWriter sr = f.CreateText()) { } FileInfo f1 = new FileInfo(@"D:\360Downloads\dir2\aa.txt"); using (StreamWriter sr = f1.AppendText()) { }
使用 File類型
Flle類型的靜態成員提供了和FileInfo類型差不多的功能。與FileInfo類似,File類提供了
AppendText(),create ()、 createText ()、 open()、 OPenRead ()、 openWrite()和 OpenText()方法。在大多數情況下,File 和 FileInfo 類型能互換使用。
using (FileStream fs = File.Create(@"D:\360Downloads\dir2\bb.txt")) { } using (FileStream fs = File.Open(@"D:\360Downloads\dir2\bb.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) { } using (FileStream fs = File.OpenRead(@"D:\360Downloads\dir2\bb.txt")) { } using (FileStream fs = File.OpenWrite(@"D:\360Downloads\dir2\bb.txt")) { } using (StreamReader sr = File.OpenText(@"D:\360Downloads\dir2\bb.txt")) { } using (StreamWriter sw = File.CreateText(@"D:\360Downloads\dir2\bb.txt")) { } using (StreamWriter sw = File.AppendText(@"D:\360Downloads\dir2\bb.txt")) { }
使用File 類型的這些新方法,只用幾行代碼就可以批量讀寫數據。更好的是,每一個成員都自動關閉基層文件句柄
File新方法如下
方法 | 作用 |
ReadAllBytes() | 打開指定文件,以字節數組形式返回二進制數據,然后關閉文件 |
ReadAllLines() | 打開指定文件,以字符串教組形式返回字符教據.然后關閉文件 |
ReadAllText() | 打開指定文件.以System.String形式返回字符數據.然后關閉文件 |
WriteAllBytes() | 打開指定文件.寫人字節數組.然后關閉文件 |
WriteAllLines() | 打開指定文件.寫人字符串教組,然后關閉文件 |
WriteAllText() | 打開指定文件.寫人字符數據.然后關閉文件 |
舉例如下
Console.WriteLine("批量讀寫數據"); string[] myTasks = { "蒸甜糕", "做糖餅", "腌桂花蜜", "做桂花釀" }; //寫入文件 File.WriteAllLines(@"D:\360Downloads\dir2\bb.txt", myTasks); //重新讀取然后輸出 foreach (string item in File.ReadAllLines(@"D:\360Downloads\dir2\bb.txt")) { Console.WriteLine(item); }
Stream抽象類
在 I/ O 操作中,流代表了在源文件和目標文件之間傳輸的一定量的數據。無論使用什么設備(文件、網絡連接和打印機等)存儲或者顯示字節。”流”都能提供一種通用的方式來和字節隊列進行交互
“流”的概念不僅僅局限於文件輸入/輸出. NET類庫提供了”流”來訪問網絡、內存地址和其他一些與流相關的抽象設備
Stream派生類型把數據表現為原始的字節流。因此,使用原始的Stream類型有點模糊。一些從Stream派生的類型支持尋址(指獲取和調整當前在流中位置的過程)。
下面有關 抽象Stream成員
抽象Stream成員 | |
成員 | 作用 |
CanRead,CanWrite和CanSeek | 檢側當前流是否支持讀、尋址和寫 |
Close() | 關閉當前流並釋放與之關聯的所有資源(如套接字和文件句柄)。在內部,這個方法是Dispose()方法的別名.因此"關閉流"從功能上說等價於"釋放流" |
Flush() | 使用當前的緩沖狀態更新基層的數據源或儲存庫。如果流不實現緩沖.這個方法什么都不做 |
Length | 返回流的長度,以字節來表示 |
Position | 檢側在當前流中的位置 |
Read()和ReadByte() | 從當前流讀取字節序列或一個字節。井將此流中的位置偏移讀取的字節數 |
Seek | 設置當前流中的位置 |
SeekLength() | 設置當前流的長度 |
Write()和WriteByte() | 向當前流中寫人字節序列或一個字節,將此流中的當前位置偏移寫人的字節數 |
使用FileStream
Fi1eStream類以合適的方式為基於文件的流提供了抽象Stream成員的實現。這是一個相當原始的流,它只能讀取或寫人一個字節或者字節數組。其實,我們通常不需要直接和 FileStream類型的成員交互,而是使用各種Stream包裝類,它們能更方便地處理文本數據和.NET 類型。
具體使用如下
Console.WriteLine("***FileStream***"); //獲取一個FileStream對象 using (FileStream fs = File.Open(@"D:\360Downloads\dir2\cc.txt", FileMode.OpenOrCreate)) { string msg = "Hello"; //把字符串編碼成字節數組 byte[] msgAsByteArray = Encoding.Default.GetBytes(msg); //寫入文件 fs.Write(msgAsByteArray, 0, msgAsByteArray.Length); //重置流的內部位置 fs.Position = 0; //從文件讀取字節並顯示在控制台 Console.WriteLine("**Your Message**"); byte[] bytesFromFile = new byte[msgAsByteArray.Length]; for (int i = 0; i < msgAsByteArray.Length; i++) { bytesFromFile[i] = (byte)fs.ReadByte(); Console.WriteLine(bytesFromFile[i]); } //解碼后字符串 Console.WriteLine("Decoded Messges:"); Console.WriteLine(Encoding.Default.GetString(bytesFromFile)); }
而FileStream的缺點:需要操作原始字節
使用streamwriter和streamreader類型
當需要讀寫基於字符的數據(比如字符串)的時候. streamWriter 和 streamReader 類就非常有用了。它們都默認使用Unicode字符.當然我們也可以提供一個正確配置的System.Text.Encoding 對象引用用來改變默認配置。
StreaoReader 和相關的 StringReader類型都從 TextReader 抽象類派生
StreaoWriter 和相關的 StringWriter類型都從 TextWriter 抽象類派生
寫入文本文件(TextWriter )
下面是關於 TextWriter核心成員
TextWriter核心成員 | |
成員 | 作用 |
Close() | 關閉當前編寫器並釋放任何與該編寫器關聯的系統資源。在這個過程中.緩沖區將被自動清理(這個成員在功能上等同與調用Dispose()方法) |
Flush() | 清理當的編寫器的所有緩沖試.使所有緩沖數據寫人基礎設備.但是不關閉偏寫器 |
NewLine | 代表派生的編寫器類的行結束符字符串。默認行結束符字符串是回車符后接一個換行符(\r\n) |
Write() | 這個重載的方法將一行寫入文本流.不限行結束符 |
WriteLine() | 這個重載的方法將一行寫入文本流,后跟行結束符 |
派生的StreamWriter類提供了對Write(), close ()和Flush()方法的有效實現.而且還定義了
AutoFlush 屬性。如果把這個屬性設置為 true 的話, StreamWriter 會在每次執行一個寫操作后,立即寫入數據並清理緩沖區。設置 AutoFlush為 false 能獲得更好的性能,這樣的話.使用 StreamWriter完成寫操作后需要調用 Close()。
寫入文本文件代碼如下:
Console.WriteLine("****Fun with StreamWriter*****"); using (StreamWriter writer = File.CreateText(@"D:\360Downloads\dir2\re.txt")) { writer.WriteLine("魚是做給大家伙兒吃的,喬初熏發覺這些人都挺愛吃甜口吃食,便打算做個糖醋鯉"); writer.WriteLine("魚是做給大家伙兒吃的,喬初熏發覺這些人都挺愛吃甜口吃食,便打算做個糖醋鯉"); writer.WriteLine("魚是做給大家伙兒吃的,喬初熏發覺這些人都挺愛吃甜口吃食,便打算做個糖醋鯉"); for (int i = 0; i < 10; i++) { writer.Write(i + " "); } } Console.WriteLine("Created file");
讀文本文件(TextReader )
下面是關於 TextReader 核心成員
TextReader 主要成員 | |
Peek() | 返回下一個可用字符,而不更改讀取器位置。返回-l表示已經到了流的尾部 |
Read() | 從輸人流中讀取救據 |
ReadBlock() | 從當前流中讀取最大計數字符,並從索引開始將該數據寫人緩沖區 |
ReadLine() | 從當前流中讀取一行字符,並將數據作為字符串返回(返回空字符串代表EOF) |
ReadToEnd | 讀取從當前位置到流結尾的所有字符,並將它們作為一個字符串返回 |
讀文本文件代碼如下:
Console.WriteLine("***Fun with StreamReader***"); using (StreamReader sr = File.OpenText(@"D:\360Downloads\dir2\re.txt")) { string inpt = null; while ((inpt=sr.ReadLine())!=null) { Console.WriteLine(inpt); } }
直接創建streamwriter/streamreader類型
Console.WriteLine("直接創建streamwriter/streamreader類型"); using (StreamWriter sw = File.CreateText(@"D:\360Downloads\dir2\chuchu.txt")) { string mag = " 不一會兒,大鍋里的水燒的滾沸,喬初熏把手洗干凈,伸手捏了些羊肉,攢成丸子便往鍋里一丟,小桃兒在旁邊看着直咋舌:“初熏姐姐,這樣會不會太松了。”她見喬初熏手上也不怎么使勁兒,生怕羊肉丸子一進鍋便散了。"; sw.WriteLine(mag); Console.WriteLine("ok"); } using (StreamReader sr = File.OpenText(@"D:\360Downloads\dir2\chuchu.txt")) { string input = null; while ((input = sr.ReadLine()) != null) { Console.WriteLine(input); } }
使用stringwriter和stringreader類型
使用 StringWriter 和 stringReader 類型,我們可以將文本信息當做內存中的字符一樣來處理。當想為基層緩沖區添加基於字符的信息的時候,它們就非常有用。
Console.WriteLine("Fun StringWriter"); using (StringWriter sw = new StringWriter()) { sw.WriteLine("喬初熏手上動作不停,一邊笑着解釋道:“不會。手勁兒太大了反而不好。汆出來的丸子容易發死,吃起來不夠鮮嫩."); Console.WriteLine(sw); }
因為StringWriter 和 StreamWriter 都從一個基類(TextWriter )派生.它們的寫操作邏輯代碼或多或少有點相同。但需要知道, StringWriter 還有一個特點.那就是它能通過 GetStringBuilder() 方法來
獲取一個System.Text.StringBuilder 對象:
Console.WriteLine("GetStringBuilder"); using (StringWriter sw = new StringWriter()) { sw.WriteLine("很快,一邊蒸鍋里的魚也差不多到火候了。喬初熏拿着勺子攪了攪湯,讓小桃兒把魚端出來。"); Console.WriteLine(sw); StringBuilder sb = sw.GetStringBuilder(); sb.Insert(0, "Hey"); Console.WriteLine(sb.ToString()); sb.Remove(0, "Hey".Length); Console.WriteLine(sb.ToString()); }
使用binarywriter和binaryreader
BinaryWriter和binaryreader都從 System.Object 直接派生。這些類可以讓我們從基層流中以簡潔的二進制格式讀取或寫人離散數據類型。 BinaryWriter 類型定義了一個多次重載的Write方法,用於把數據類創寫入基層的流,除Write()方法, BinaryWriter還提供了另外一些成員讓我們能獲取或設置從Stream派生的類型,並且提供了隨機數據訪問
下面有關 BinaryWriter核心成員
BinaryWriter核心成員 | |
BaseStream | 這個只讀屬性提供了BinaryWriter對象使用的基層流的訪問 |
Close() | 這個方法關閉二進制流 |
Flush() | 這個方法別新二進制流 |
seek() | 這個方法設置當前流的位置 |
Write | 這個方法將值寫入當前流 |
下面有關 BinaryReaer核心成員
BinaryReader成員 | |
BaseStream | 這個只讀屬性提供了BinaryReder對象使用的基層流的訪問 |
Close() | 這個方法關閉二進制閱讀器 |
PeekChar() | 這個方法返回下一個可用的字符,並且不改變指向當前字節或字符的指針位置 |
Read() | 讀取給定的字節或字符,並把它們存入數組 |
Readxxx() | BinaryReader類定義了許多 Read()方法來從流中獲取下一個類型(ReadBoolean() ReadByte() ReadInt32()) |
下面是有關的代碼
Console.WriteLine("*****Fun with Writer 和Reader******"); FileInfo f = new FileInfo(@"D:\360Downloads\dir2\aa.txt"); using (BinaryWriter bw = new BinaryWriter(f.OpenWrite())) { Console.WriteLine(bw.BaseStream); double a = 1234.67; int i = 3452; string str = "Hello"; bw.Write(a); bw.Write(i); bw.Write(str); } Console.WriteLine("Done!"); using (BinaryReader br = new BinaryReader(f.OpenRead())) { Console.WriteLine(br.ReadDouble()); Console.WriteLine(br.ReadInt32()); Console.WriteLine(br.ReadString()); }
以編程方式"觀察"文件 FileSystemWatcher
Console.WriteLine("****FileSystemWatcher****"); FileSystemWatcher watcher = new FileSystemWatcher(); try { watcher.Path = @"D:\360Downloads\dir2"; } catch (Exception e) { Console.WriteLine(e.Message); } watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; watcher.Filter = "*.txt"; watcher.Changed += new FileSystemEventHandler(OnChanged); watcher.Created += new FileSystemEventHandler(OnChanged); watcher.Deleted += new FileSystemEventHandler(OnChanged); watcher.Renamed += new RenamedEventHandler(OnRenamed); watcher.EnableRaisingEvents = true; Console.WriteLine("Press q"); while (Console.ReadLine() != "q") static void OnChanged(object source, FileSystemEventArgs e) { Console.WriteLine("File:{0}{1}", e.FullPath, e.ChangeType); } static void OnRenamed(object source, FileSystemEventArgs e) { Console.WriteLine("File:{0},OnRenamed:{1}", e.FullPath, e.ChangeType); }