c# 文件與流


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類的實例被釋放或者操作內存映射文件的最后一個進程退出后,文件就會被銷毀。

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM