在.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類成員的做用是用來獲取指定文件或目錄的通常特性(好比建立時間、各類特性等)。ui
FilesystemInfo 屬性編碼
FllesystemInfo 屬性 | |
屬性 | 做用 |
Attributes | 獲取或設置與當前文件關聯的特性.由 FlleAttrlbutes 枚舉表示(例如.是隻讀、加密、隱藏或壓縮文件或目錄) |
CreationTime | 獲取或設置當前文件或目錄的建立時間 |
Exists | 用來判斷指定文件或目錄是否存在的值 |
Extension | 獲取文件的擴展名 |
FullName | 獲取目錄或文件的完整路徑 |
LastAccessTime | 獲取或設置上次訪問當前文件或目錄的時間 |
LastWriteTime | 獲取或設置上次寫人當前文件或目錄的時間 |
Name | Name 獲取當前文件或目錄的名稱 |
FilesystemInfo 類型還定義了Delete()方法,該操做由派生類型從硬盤中刪除指定文件或目錄來實現。一樣,在獲取文件特性前使用Refresh()方法能確保當前文件(或目錄)的統計信息是最新的。加密
使用Directoryinfo類型spa
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); }