1、創建和刪除目錄
在c#中涉及到輸入、輸出(i/o)相關操作的API都被放在System.IO命名空間下,或者子命令System.IO.IsolatedStoorage中。對目錄進行操作可以使用Directory類和DirectoryInfo類。Directory類,提供了一些便捷的方法可以幫助開發人員輕松的對目錄進行操作。DirectoryInfo類的功能和Directory類相似,公開了更多的成員以獲得目錄信息。
使用兩個按鈕實現,文件目錄的創建和刪除
//引入輸入、輸出命名空間。 using System.IO; namespace WindowsFormsApp1 { public partial class Form1 : Form { //聲明兩個私有字段 DirectoryInfo dirInfo = null;//操作目錄的對象 string dirName = string.Empty;//用於存儲目錄名稱 public Form1() { InitializeComponent(); } //創建按鈕Click private void button1_Click(object sender, EventArgs e) { //判斷輸入是否為空 if(string .IsNullOrWhiteSpace(textBox1.Text)) { //打印提示語句 MessageBox.Show("IN err"); return; } dirName = textBox1.Text.Trim();//從當前System.String 對象移除所有空白字符和尾部空白字符 保存在目錄名中 dirInfo = new DirectoryInfo(dirName);//實例dirInfo //判斷目錄是否存在 if(dirInfo.Exists)//如果目錄存在,則為 true;否則為 false。 { dirInfo.Delete();//如果存在刪除目錄 } //創建目錄 dirInfo.Create(); MessageBox.Show("目錄" + dirName + "創建成功"); } private void Form1_Load(object sender, EventArgs e) { } //刪除按鈕Click private void button2_Click(object sender, EventArgs e) { if(dirInfo!=null && !string.IsNullOrWhiteSpace(dirName)) { dirInfo.Delete(); dirInfo = null; } } } }
注意:如果希望在指定的目錄下創建目錄,可以指定絕對路徑。
2、創建文件和刪除文件
與目錄操作相似,對於文件操作,同樣有兩個類可以選擇。File類和FileInfo類。
//引入文件命名空間 using System.IO; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } string fileName = string.Empty;//用於存放新文件的名字 private void Form1_Load(object sender, EventArgs e) { } //Create Click Button function private void Create_Click(object sender, EventArgs e) { //判斷文件名是否為空 if(string.IsNullOrWhiteSpace(Name.Text)) { MessageBox.Show("文件名為空"); return; } fileName = Name.Text; //如果文件已存在,刪除 if (File.Exists(fileName))//確定指定文件是否存在 { File.Delete(fileName); } var fs = File.Create(fileName);//創建文件 //向文件寫入3000字節 Random rand = new Random(); byte[] buf = new byte[3000]; rand.NextBytes(buf);//使用隨機數填充指定字節數組元素 fs.Write(buf, 0, buf.Length);//將字節快寫去文件流 MessageBox.Show("創建"+fileName+"成功"); fs.Dispose();//釋放資源,Syst.IO.Stream使用的資源 } private void Delete_Click(object sender, EventArgs e) { if(File.Exists(fileName)) { File.Delete(fileName);//刪除文件 } } } }
3、流
流是數據傳遞的一個載體,他是一個以Stream類為公共基類的對象,封裝了一系列成員用於對流進行讀寫操作。流內有一個 位置指針 用於指示當前讀寫的位置。按照使用的方式不同,流也可以分為文件流、內存流和網絡流。
文件流:用於對文件進行操作的流對象。
內存流:僅僅存在內存中,當應用程序退出或計算機電源關閉,內存流中的數據就會丟失,一般可以用來臨時存儲數據。
網絡流:用於網絡數據的傳輸,例如在Socket可以使用網絡流來發送和接收數據。
流對象自身在封裝是會公開相關以便開發人員對流進行操作。為了使流操作方便,System.IO命名空間提供了幾個輔助類
StreamReader 類和StreamWriter類:封裝了對流中有關字符的操作。例如向流中寫入一行字符,或者一次性讀取所有字符
BinaryReader類和BinaryWriter類:專用於讀寫二進制數據,例如讀取一個整形數int
4、讀寫文件
對文件進行讀寫需要用到文件流FillStrea,可以通過以下幾種方式獲取文件里流對象
讀取:File類的Open或者OpenRead方法。 FileInfo類的Open或OpenRead方法
寫入:File類的Create方法 File類的Open或者Openwrite方法 FileInfo類的Create方法 FileInfo類的Open或OpenWriter方法
如果僅僅希望簡單的進行讀寫操作,可以直接使用File類的 WriteAllBytes、WriteAllLines、WriteAllText、ReadAllText、ReadLines等方法
using System.IO; namespace ConsoleApp1 { class Program { const string FILE_NAME = "newFIle.txt";//定義文件名 static void Main(string[] args) { /*****寫入數據 *****/ //創建FileStream流實例 //打開文件,如果文件不存在就創建文件。以寫入方式打開文件, using (FileStream fs = new FileStream(FILE_NAME, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read)) { BinaryWriter bw = new BinaryWriter(fs);//初始化 System.IO.BinareWrite實例 bw.Write(false);//寫入一個bool值 bw.Write((int)9999);//寫入一個int值 bw.Write("hello hjx");//寫入字符串 bw.Close();//關閉對象 } Console.WriteLine("file write is ok"); /*******讀出數據******/ bool b; int n; string s; using (FileStream fsin = File.OpenRead(FILE_NAME))//打開文件 { BinaryReader br = new BinaryReader(fsin);//實例fsin //讀出的順序必須與寫入的順序相同 b = br.ReadBoolean();// 從當前流中讀取 Boolean 值,並使該流的當前位置提升 1 個字節。 n = br.ReadInt32();//從當前流中讀取 4 字節有符號整數,並使流的當前位置提升 4 個字節 s = br.ReadString();//讀出字符串從當前流中讀取一個字符串。 字符串有長度前綴,一次 7 位地被編碼為整數。 br.Close();//關閉對象 } //顯示結果 Console.WriteLine("{0}", b); Console.WriteLine("{0}", n); Console.WriteLine("{0}", s); Console.ReadLine(); } } }
直接使用FileStream 類讀寫文件
using System.IO; namespace ConsoleApp2 { class Program { static void Main(string[] args) { Random rand = new Random();//實例random byte[] buf = new byte[10]; //產生10個隨機字節 rand.NextBytes(buf);//使用隨機數填充指定字節數組元素 Console.WriteLine("隨機序列{0}",BitConverter.ToString(buf)); //將隨機產生的字節寫入文件 try { FileStream fs = File.Create("data.dt"); //將字節數組中所有的字節都寫入文件 fs.Write(buf, 0, buf.Length); fs.Close();//關閉文件流 Console.WriteLine("write data ok"); } catch(IOException ex) { Console.WriteLine(ex.Message);//輸出錯誤信息 } //從文件中讀出數據 Array.Clear(buf, 0, buf.Length);//清除buf中的內容 try { FileStream fs = File.OpenRead("data.dt"); //從文件流中讀出所有字節 fs.Read(buf, 0, buf.Length); fs.Close();//關閉文件流 } catch(IOException ex) { Console.WriteLine(ex.Message); } //輸出結果 Console.WriteLine("read data:{0}", BitConverter.ToString(buf)); Console.Read(); } } }
5、內存流
內存流按照類型可以分為托管內存流 ,以MemoryStream類為代表,和非托管內存流以UnmannedMemoryStream代表,在實際的開發中,使用最多的是托管內存流,而非托管內存流一般可以用於操作內存映射文件。
using System.IO; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { MemoryStream ms = new MemoryStream();//創建內存流 //創建文件流用於保存png圖像 FileStream fs = new FileStream("1.png", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read); //生成位圖 using (Bitmap bmp = new Bitmap(150, 150)) { Graphics g = Graphics.FromImage(bmp); Pen mypen = new Pen(Color.Blue, 5f); Rectangle rect1 = new Rectangle(20, 50, 60, 50);// 用指定的位置和大小初始化 System.Drawing.Rectangle 類的新實例。 Rectangle rect2 = new Rectangle(80, 0, 60, 120); //繪制矩形 g.DrawRectangles(mypen, new Rectangle[] { rect1, rect2 }); // 繪制一系列由 System.Drawing.Rectangle 結構指定的矩形。 mypen.Dispose();//釋放鋼筆對象 g.FillEllipse(Brushes.Red, new Rectangle(35, 40, 90, 90)); // 填充 System.Drawing.Rectangle 結構指定的邊框所定義的橢圓的內部。 g.Dispose();//釋放畫布對象 bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);//將圖像保存到內存流中 bmp.Save(fs, System.Drawing.Imaging.ImageFormat.Png);//將圖像保存到文件流中 } //從內存流中加載圖像 this.pictureBox1.Image = Image.FromStream(ms); ms.Dispose();//釋放內存流 } } }
6、內存映射文件
MemoryMappedFile類位於System.IO.MemoryMappedFile命名空間,公開了一系列的Api,用於創建和讀寫內存映射文件。內存映射文件存在於內存中,形式上類似磁盤上存儲的文件,只是內存映射文件存放在內存中。當MemoryMappedFild類的實例被釋放或者操作內存映射文件的最后一個進程退出后,文件就會被銷毀。