簡述C#中IO的應用
在.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); }