C#基礎文件操作

文件操作

File類

File類支持對文件的基本操作,包括提供用於創建、複製、刪除、移動和打開文件的靜態方法,並協助創建FileStream對象。由於所有的File類的方法都是靜態的,所以如果只想執行一個操作,那麼使用File方法的效率比使用相應的FileInfo實例方法可能更高。

方法 說明
Create 在指定路徑中創建文件
Copy 將現有文件複製到新文件
Exists 確定指定的文件是否存在
GetCreationTime 返回指定文件或目錄的創建日期和時間
GetLastAccessTime 返回上次訪問指定文件或目錄的日期和時間
GetLastWriteTime 返回上次寫入指定文件或目錄的日期和時間
Move 將指定文件移到新位置,並提供指定新文件名的選項
Open 打開指定路徑上的FileStream
OpenRead 打開現有文件以進行讀取
OpenText 打開現有UTF-8編碼文本文件以進行讀取
OpenWrite 打開現有文件以進行寫入

FileInfo類

FileInfo類和File類之間許多方法調用都是相同的,但是FileInfo類沒有靜態方法,僅可以用於實例化對象。File類是靜態類,所以它的調用需要字符串參數爲每一個方法調用規定文件位置,因此如果要在對象上進行單一方法調用,則可以使用靜態File類,反之則使用FileInfo類。

屬性 說明
CreationTime 獲取或設置當前FileSystemInfo對象的創建時間
DirectoryName 獲取表示目錄的完整路徑的字符串
Exists 獲取指示文件是否存在的值
Extension 獲取表示文件擴展名部分的字符串
FullName 獲取目錄或文件的完整目錄
Length 獲取當前文件的大小
Name 獲取文件名

例子

使用File類在項目文件夾下創建文件,在創建文件時,需要判斷該文件是否已經存在,如果存在,彈出信息提示;否則,創建文件,並在ListView列表中顯示文件的名稱、擴展名、大小及修改時間等信息。

控件:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-rBOS1GrP-1589477028336)(C:\Users\biny\AppData\Roaming\Typora\typora-user-images\1589476058224.png)]

邏輯:

        private void button1_Click(object sender, EventArgs e)
        {
            if (File.Exists(textBox1.Text))//判斷要創建的文件是否存在
            {
                MessageBox.Show("該文件已經存在,請重新輸入");
            }
            else
            {
                File.Create(textBox1.Text);//創建文件
                FileInfo fInfo = new FileInfo(textBox1.Text);//創建FileInfo對象
                ListViewItem li = new ListViewItem();
                li.SubItems.Clear();
                li.SubItems[0].Text = fInfo.Name;//顯示文件名稱
                li.SubItems.Add(fInfo.Extension);//顯示文件擴展名
                li.SubItems.Add(fInfo.Length / 1024 + "KB");//顯示文件大小
                li.SubItems.Add(fInfo.LastWriteTime.ToString());//顯示文件修改時間
                listView1.Items.Add(li);
            }
        }

Directory類

Directory類用於文件夾的典型操作,如複製、移動、重命名、創建和刪除等,另外,也可將其用於獲取和設置與目錄的創建、訪問及寫入操作相關的DateTime信息。

方法 說明
CreateDirectory 創建指定路徑中的目錄
Delete 刪除指定的目錄
Exists 確定給定路徑是否引用磁盤上的現有目錄
GetCreationTime 獲取目錄的創建日期和時間
GetCurrentDirectory 獲取應用程序的當前工作目錄
GetDirectories 獲取指定目錄中子目錄的名稱
GetFiles 返回指定目錄中的文件的名稱
GetLogicalDrives 檢索此計算機上格式爲“<驅動器號>:\”的邏輯驅動器的名稱
GetParent 檢索指定路徑的父目錄,包括絕對路徑和相對路徑
Move 將文件或目錄及其內容移到新位置
SetCreationTime 爲指定的文件或目錄設置創建日期和時間
SetCurrentDirectory 將應用程序的當前工作目錄設置爲指定的目錄

DirectoryInfo類

DirectoryInfo類和Directory類之間的關係與FileInfo類和File類之間的關係十分類似。

屬性 說明
Attributes 獲取或設置當前Filesysteminfo的Fileattributes
CreationTime 獲取或設置當前FileSystemInfo對象的創建時間
Exists 獲取指示目錄是否存在的值
FullName 獲取目錄或文件的完整目錄
Parent 獲取指定子目錄的父目錄
Name 獲取DirectoryInfo實例的名稱

例子

遍歷指定驅動器下的所有文件夾及文件名稱。

控件:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-B5zM16ge-1589477028338)(C:\Users\biny\AppData\Roaming\Typora\typora-user-images\1589475994301.png)]

邏輯:

//獲取所有驅動器,並顯示在ComboBox中
private void Form1_Load(object sender, EventArgs e)
{
    string[] dirs = Directory.GetLogicalDrives();//獲取計算上的邏輯驅動器的名稱
    if (dirs.Length > 0)//如果有驅動器
    {
        for (int i = 0; i < dirs.Length; i++)//遍歷驅動器
        {
            comboBox1.Items.Add(dirs[i]);//將驅動名稱添加到下拉項中
        }
    }
}
//選擇驅動器
private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
    if (((ComboBox)sender).Text.Length > 0)//如果在下拉項中選擇了值
    {
        treeView1.Nodes.Clear();//清空treeView1控件
        TreeNode TNode = new TreeNode();//實例化TreeNode
        //將驅動器下的文件夾及文件名稱添加到treeView1控件上
        Folder_List(treeView1, ((ComboBox)sender).Text, TNode, 0);
    }
}
#region  顯示文件夾下所有子文件夾及文件的名稱
/// <summary>
/// 顯示文件夾下所有子文件夾及文件的名稱
/// </summary>
/// <param Sdir="string">文件夾的目錄</param>
/// <param TNode="TreeNode">節點</param>
/// <param n="int">標識,判斷當前是文件夾,還是文件</param>
private void Folder_List(TreeView TV, string Sdir, TreeNode TNode, int n)
{
    if (TNode.Nodes.Count > 0)//如果當前節點下有子節點
        if (TNode.Nodes[0].Text != "")//如果第一個子節點的文本爲空
            return;//退出本次操作
    if (TNode.Text == "")//如果當前節點的文本爲空
        Sdir += "\\";//設置驅動器的根路徑
    DirectoryInfo dir = new DirectoryInfo(Sdir);//實例化DirectoryInfo類
    try
    {
        if (!dir.Exists)//判斷文件夾是否存在
        {
            return;
        }
        DirectoryInfo dirD = dir as DirectoryInfo;//如果給定參數不是文件夾,則退出
        if (dirD == null)//如果文件夾是否爲空
        {
            TNode.Nodes.Clear();//清空當前節點
            return;
        }
        else
        {
            if (n == 0)//如果當前是文件夾
            {
                if (TNode.Text == "")//如果當前節點爲空
                    TNode = TV.Nodes.Add(dirD.Name);//添加文件夾的名稱
                else
                {
                    TNode.Nodes.Clear();//清空當前節點
                }
                TNode.Tag = 0;//設置文件夾的標識
            }
        }
        FileSystemInfo[] files = dirD.GetFileSystemInfos();//獲取文件夾中所有文件和文件夾
        //對單個FileSystemInfo進行判斷,遍歷文件和文件夾
        foreach (FileSystemInfo FSys in files)
        {
            FileInfo file = FSys as FileInfo;//實例化FileInfo類
            if (file != null)//如果是文件的話,將文件名添加到節點下
            {
                FileInfo SFInfo = new FileInfo(file.DirectoryName + "\\" + file.Name);//獲取文件所在路徑
                TNode.Nodes.Add(file.Name);//添加文件名
                TNode.Tag = 0;//設置文件標識
            }
            else//如果是文件夾
            {
                TreeNode TemNode = TNode.Nodes.Add(FSys.Name);//添加文件夾名稱
                TNode.Tag = 1;//設置文件夾標識
                TemNode.Nodes.Add("");//在該文件夾的節點下添加一個空文件夾,表示文件夾下有子文件夾或文件
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        return;
    }
}
#endregion
private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (((TreeView)sender).SelectedNode == null)//如當前節點爲空
        return;
    //將指定目錄下的文件夾及文件名稱清加到treeView1控件的指定節點下
    Folder_List(treeView1, ((TreeView)sender).SelectedNode.FullPath.Replace("\\\\", "\\"),((TreeView)sender).SelectedNode, 0);
}

DriveInfo類

DriveInfo類用來提供對有關驅動器的信息的訪問,使用DriveInfo類可以確定哪些驅動器可用,以及這些驅動器的類型,還可以通過查詢來確定驅動器的容量和可用空閒空間。

DriveInfo類最主要的一個方法是GetDrives方法,該方法用來檢索計算機上的所有邏輯驅動器的驅動器名稱。

例子

使用DriveInfo類獲取本地計算機上的所有磁盤驅動器,當用戶選擇某個驅動器時,將其包含的所有文件夾名稱及創建時間顯示到ListView列表中。

控件:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WbB6oLmx-1589477028342)(C:\Users\biny\AppData\Roaming\Typora\typora-user-images\1589476197015.png)]

邏輯:

private void Form1_Load(object sender, EventArgs e)
{
    DriveInfo[] dInfos = DriveInfo.GetDrives();//獲取本地所有驅動器
    foreach (DriveInfo dInfo in dInfos)//遍歷獲取到的驅動器
    {
        comboBox1.Items.Add(dInfo.Name);//將驅動器名稱添加到下拉列表中
    }
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    string[] strDirs = Directory.GetDirectories(comboBox1.Text);//獲取指定磁盤下的所有文件夾
    foreach (string strDir in strDirs)//遍歷獲取到的文件夾
    {
        ListViewItem li = new ListViewItem();
        li.SubItems.Clear();
        DirectoryInfo dirInfo = new DirectoryInfo(strDir);//使用遍歷到的文件夾創建DirectoryInfo對象
        li.SubItems[0].Text = dirInfo.Name;//顯示文件夾名稱
        li.SubItems.Add(dirInfo.CreationTime.ToString());//顯示文件夾創建時間
        listView1.Items.Add(li);
    }
}

FileStream類

方法 說明
Close 關閉當前流並釋放與之關聯的所有資源
Lock 允許讀取訪問的同時防止其他進程更改FileStream
Read 從流中讀取字節塊並將該數據寫入給定緩衝區中
ReadByte 從文件中讀取一個字節,並將讀取位置提升一個字節
Seek 將該流的當前位置設置爲給定值
SetLength 將該流的長度設置爲給定值
Unlock 允許其他進程訪問以前鎖定的某個文件的全部或部分
Write 使用從緩衝區讀取的數據將字節塊寫入該流

例子

使用不同的方式打開文件,其中包含“讀寫方式打開”、“追加方式打開”、“清空後打開”和“覆蓋方式打開”,然後對其進行寫入和讀取操作。

控件:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mvfjjvAH-1589477028343)(C:\Users\biny\AppData\Roaming\Typora\typora-user-images\1589476439445.png)]

邏輯

FileMode fileM = FileMode.Open;//聲明一個FileMode對象,用來記錄要打開的方式
//執行讀寫操作
private void button1_Click(object sender, EventArgs e)
{
    string path = textBox1.Text;//獲取打開文件的路徑
    try
    {
        using (FileStream fs = File.Open(path, fileM))//以指定的方式打開文件
        {
            if (fileM != FileMode.Truncate)//如果在打開文件後不清空文件
            {
                Byte[] info = new UTF8Encoding(true).GetBytes(textBox2.Text);//將要添加的內容轉換成字節
                fs.Write(info, 0, info.Length);//向文件中寫入內容
            }
        }
        using (FileStream fs = File.Open(path, FileMode.Open))//以讀/寫方式打開文件
        {
            byte[] b = new byte[1024];//定義一個字節數組
            UTF8Encoding temp = new UTF8Encoding(true);//實現UTF-8編碼
            string pp = "";
            while (fs.Read(b, 0, b.Length) > 0)//讀取文本中的內容
            {
                pp += temp.GetString(b);//累加讀取的結果
            }
            MessageBox.Show(pp);//顯示文本中的內容
        }
    }
    catch//如果文件不存在,則發生異常
    {
        if (MessageBox.Show("該文件不存在,是否創建文件。", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)//顯示提示框,判斷是否創建文件
        {
            FileStream fs = File.Open(path, FileMode.CreateNew);//在指定的路徑下創建文件
            fs.Dispose();//釋放流
        }
    }
}
//選擇打開方式
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
    if (((RadioButton)sender).Checked == true)//如果單選按鈕被選中
    {
        switch (Convert.ToInt32(((RadioButton)sender).Tag.ToString()))//判斷單選項的選中情況
        {
            //記錄文件的打開方式
            case 0: fileM = FileMode.Open; break;//以讀/寫方式打開文件
            case 1: fileM = FileMode.Append; break;//以追加方式打開文件
            case 2: fileM = FileMode.Truncate; break;//打開文件後清空文件內容
            case 3: fileM = FileMode.Create; break;//以覆蓋方式打開文件
        }
    }
}

例子

登陸創建日誌。

登陸控件:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-JtXtbSwu-1589477028346)(C:\Users\biny\AppData\Roaming\Typora\typora-user-images\1589476723851.png)]

登陸邏輯:

private void button1_Click(object sender, EventArgs e)
{
    if (!File.Exists("Log.txt"))//判斷日誌文件是否存在
    {
        File.Create("Log.txt");//創建日誌文件
    }
    string strLog = "登錄用戶:" + textBox1.Text + "    登錄時間:" + DateTime.Now;
    if (textBox1.Text != "" && textBox2.Text != "")
    {
        using (StreamWriter sWriter = new StreamWriter("Log.txt", true))//創建StreamWriter對象
        {
            sWriter.WriteLine(strLog);//寫入日誌
        }
        Form1 frm = new Form1();//創建Form1窗體
        this.Hide();//隱藏當前窗體
        frm.Show();//顯示Form1窗體
    }
}

日誌控件:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xafampsC-1589477028348)(C:\Users\biny\AppData\Roaming\Typora\typora-user-images\1589476715355.png)]

日誌邏輯:

private void Form1_Load(object sender, EventArgs e)
{
    StreamReader SReader = new StreamReader("Log.txt", Encoding.UTF8);			//創建StreamReader對象
    string strLine = string.Empty;
    while ((strLine = SReader.ReadLine()) != null)//逐行讀取日誌文件
    {
        //獲取單條日誌信息
        string[] strLogs = strLine.Split(new string[] { "    " }, StringSplitOptions.RemoveEmptyEntries);
        ListViewItem li = new ListViewItem();
        li.SubItems.Clear();
        li.SubItems[0].Text = strLogs[0].Substring(strLogs[0].IndexOf(':') + 1);//顯示登錄用戶
        li.SubItems.Add(strLogs[1].Substring(strLogs[1].IndexOf(':') + 1));//顯示登錄時間
        listView1.Items.Add(li);
    }
}

二進制流寫入例子

控件

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VvJELKQ5-1589477028350)(C:\Users\biny\AppData\Roaming\Typora\typora-user-images\1589476811816.png)]

邏輯

private void button1_Click(object sender, EventArgs e)
{
    if (textBox1.Text == string.Empty)//判斷文本框是否爲空
    {
        MessageBox.Show("要寫入的文件內容不能爲空");
    }
    else
    {
        saveFileDialog1.Filter = "二進制文件(*.dat)|*.dat";//設置保存文件的格式
        if (saveFileDialog1.ShowDialog() == DialogResult.OK)//判斷是否選擇了文件
        {
            //使用“另存爲”對話框中輸入的文件名實例化FileStream對象
            FileStream myStream = new FileStream(saveFileDialog1.FileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
            //使用FileStream對象實例化BinaryWriter二進制寫入流對象
            BinaryWriter myWriter = new BinaryWriter(myStream);
            myWriter.Write(textBox1.Text);//以二進制方式向創建的文件中寫入內容
            myWriter.Close();//關閉當前二進制寫入流
            myStream.Close();//關閉當前文件流
            textBox1.Text = string.Empty;//清空文本框
        }
    }
}

private void button2_Click(object sender, EventArgs e)
{
    openFileDialog1.Filter = "二進制文件(*.dat)|*.dat";//設置打開文件的格式
    if (openFileDialog1.ShowDialog() == DialogResult.OK)//判斷是否選擇了文件
    {
        textBox1.Text = string.Empty;//清空文本框
        //使用“打開”對話框中選擇的文件名實例化FileStream對象
        FileStream myStream = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
        //使用FileStream對象實例化BinaryReader二進制寫入流對象
        BinaryReader myReader = new BinaryReader(myStream);
        if (myReader.PeekChar() != -1)//判斷是否有數據
        {
            //以二進制方式讀取文件中的內容
            textBox1.Text = Convert.ToString(myReader.ReadInt32());
        }
        myReader.Close();//關閉當前二進制讀取流
        myStream.Close();//關閉當前文件流
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章