中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#怎么開發Winform實現文件操作

發布時間:2022-04-29 13:41:20 來源:億速云 閱讀:274 作者:iii 欄目:開發技術

這篇文章主要介紹了C#怎么開發Winform實現文件操作的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C#怎么開發Winform實現文件操作文章都會有所收獲,下面我們一起來看看吧。

    一、文件對話框

    C#中共有三種文件對話框,分別用于不同的功能:

    • (1)用于打開文件的對話框OpenFileDialog。

    • (2)用于保存文件的對話框SaveFileDialog。

    • (3)打開文件夾的對話框FolderBroswerDialog。

    示例:如下圖,點擊三個按鈕分別彈出三種對話框,進行相應操作之后,將路徑在文本框中顯示:

    C#怎么開發Winform實現文件操作

    (1)OpenFileDialog對話框

    修改OpenFileDialog對話框的Name屬性為ofDlg。在“打開”按鈕添加ofDlg.ShowDialog(); 界面如下:

    C#怎么開發Winform實現文件操作

    通過ShowDialog()的返回值,判斷點擊的是“打開”還是“取消”。在“打開”按鈕點擊事件中編寫如下代碼:

    private void btnOpen_Click(object sender, EventArgs e)
    {
        //判斷是否點擊的“打開”按鈕
        if (ofDlg.ShowDialog() == DialogResult.OK)
        {
            txtPath.Text = ofDlg.FileName;
    	}
    }

    OpenFileDialog常用屬性表:

    屬性名功能說明
    InitialDirectory對話框的初始目錄
    Filter文件篩選器,按"顯示名稱|類型"格式編寫 例如,"文本文件(.txt)|.txt|所有文件(.)||."
    FilterIndex在對話框中選擇的文件篩選器的索引,如果選第一項就設為1
    FileName第一個在對話框中顯示的文件或最后一個選取的文件
    Title將顯示在對話框標題欄中的字符
    CheckFileExists在用戶指定不存在的文件時是否顯示警告
    CheckPathExists在對話框返回之前,檢查指定路徑是否存在

    (2)SaveFileDialog對話框

    保存文件對話框常用于軟件中的“另存為”功能。其常用屬性、方法及使用方式與打開文件對話框相同。

    設置保存文件對話框的Filter屬性為“文本文件|*.txt”。在“保存”按鈕的點擊事件中編寫如下代碼:

    private void btnSave_Click(object sender, EventArgs e)
    {
        if (sfDlg.ShowDialog() == DialogResult.OK)
        {
            txtPath.Text = sfDlg.FileName;
        }
    }

    (3)FolderBroswerDialog對話框

    瀏覽文件夾對話框常用于瀏覽文件夾,選擇文件夾路徑。

    在“瀏覽”按鈕的點擊事件中編寫如下代碼:

    private void btnBrowse_Click(object sender, EventArgs e)
    {
        if (fbDlg.ShowDialog() == DialogResult.OK)
        {
            txtPath.Text = fbDlg.SelectedPath;
        }
    }

    FolderBroswerDialog常用屬性:

    屬性名能說明功
    Description顯示在對話框的樹視圖上方的字符串,用來指定顯示給用戶的指導信息
    RootFolder設置根文件夾位置
    SelectedPath對話框中最先選擇的文件夾或用戶最后選擇的文件夾完整路徑
    ShowNewFold對話框中是否包括“新建文件夾”按鈕

    二、文件及文件夾操作

    文件及文件夾管理是操作系統的重要組成部分,主要包括創建、移動、復制和刪除等操作。

    Directory類和DirectoryInfo類用于對磁盤和文件夾的操作管理。

    File類和FileInfo類用于對文件進行常用操作管理。

    (1)文件常用操作

    在C#中如果對文件進行創建、復制和刪除等少量操作一般使用File類。

    File類是靜態類,其中所有方法都是靜態的,通過類名直接調用,不需要實例化。

    示例,如下圖,進行文件的基本操作:

    C#怎么開發Winform實現文件操作

    點擊"選擇文件"按鈕選擇某個文件,并將文件路徑在文本框顯示。

    點擊"選擇文件夾"按鈕選擇某個文件夾,并將文件夾路徑在文本框顯示。

    點擊"復制文件"按鈕,實現將文件復制到文件夾中。

    點擊"移動文件"按鈕,實現將文件移動到文件夾中。

    點擊"刪除文件"按鈕,實現將文件刪除。

    其中,"選擇文件"按鈕name=btOpenFile,"選擇文件夾"按鈕name=btOpenFolder,"復制文件"按鈕name=btCopy,"移動文件"按鈕name=btMove,"刪除文件"按鈕name=btDelete。

    存放文件名的文本框name=txtFile,存放文件夾名的文本框name=txtFolder。

    文件對話框name=openFileDialog1,文件夾對話框name=folderBrowserDialog1。

    File類實現代碼如下:

    //選擇文件按鈕
    private void btOpenFile_Click(object sender, EventArgs e)
    {
        if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            //FileName包含路徑,SafeFileName不包含路徑
            this.txtFile.Text = this.openFileDialog1.FileName;
        }
    }
    //選擇文件夾按鈕
    private void btOpenFolder_Click(object sender, EventArgs e)
    {
        if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)
        {
            this.txtFolder.Text = this.folderBrowserDialog1.SelectedPath;
        }
    }
    //復制文件按鈕
    private void btCopy_Click(object sender, EventArgs e)
    {
        if (!File.Exists(this.txtFile.Text))
        {
            MessageBox.Show("文件不存在!");
            return;
        }
        if (!Directory.Exists(this.txtFolder.Text))
        {
            MessageBox.Show("文件夾不存在!");
            return;
        }
        string[] arrName = this.txtFile.Text.Split('\\');
        string name = arrName[arrName.Length - 1];
        //第三個參數true代表文件存在直接覆蓋
        //如果希望不覆蓋,此處添加代碼判斷文件已經存在給出提示
        File.Copy(this.txtFile.Text, this.txtFolder.Text + "\\" + name,true);
        MessageBox.Show("復制成功!");
    }
    
    //移動文件
    private void btMove_Click(object sender, EventArgs e)
    {
        if (!File.Exists(this.txtFile.Text))
        {
            MessageBox.Show("文件不存在!");
            return;
        }
        if (!Directory.Exists(this.txtFolder.Text))
        {
            MessageBox.Show("文件夾不存在!");
            return;
        }
        string[] arrName = this.txtFile.Text.Split('\\');
        string name = arrName[arrName.Length - 1];
        string newFileName = this.txtFolder.Text + "\\" + name;
        if (File.Exists(newFileName))
        {
            //方案一:提示用戶有重名文件
            //MessageBox.Show("目標位置有重名文件!");
            //return;
    
            //方案二:直接將目標文件刪除
            File.Delete(newFileName);
        }
        File.Move(this.txtFile.Text, newFileName);
        MessageBox.Show("移動成功!");
    }
    
    //刪除文件
    private void btDelete_Click(object sender, EventArgs e)
    {
        if (!File.Exists(this.txtFile.Text))
        {
            MessageBox.Show("文件不存在!");
            return;
        }
        File.Delete(this.txtFile.Text);
        MessageBox.Show("刪除成功!");
    }

    和FileInfo類相比,使用File類可以避免頻繁創建和釋放對象的系統開銷,但如果需要多次重用某個文件對象,則使用FileInfo類。

    下面使用FileInfo類實現相同功能,代碼如下:

    //選擇文件按鈕
    private void btOpenFile_Click(object sender, EventArgs e)
    {
        if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            //FileName包含路徑,SafeFileName不包含路徑
            this.txtFile.Text = this.openFileDialog1.FileName;
        }
    }
    //選擇文件夾按鈕
    private void btOpenFolder_Click(object sender, EventArgs e)
    {
        if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)
        {
            this.txtFolder.Text = this.folderBrowserDialog1.SelectedPath;
        }
    }
    //復制文件
    private void btCopy_Click(object sender, EventArgs e)
    {
        FileInfo fInfo = new FileInfo(this.txtFile.Text);
        if (fInfo.Exists == false)
        {
            MessageBox.Show("文件不存在!");
            return;
        }
        DirectoryInfo dInfo = new DirectoryInfo(this.txtFolder.Text);
        if (dInfo.Exists == false)
        {
            MessageBox.Show("文件夾不存在!");
            return;
        }
        string[] arrName = this.txtFile.Text.Split('\\');
        string name = arrName[arrName.Length - 1];
        //第二個參數true代表文件存在直接覆蓋
        fInfo.CopyTo(this.txtFolder.Text + "\\" + name, true);
        MessageBox.Show("復制成功!");
    }
    //移動文件
    private void btMove_Click(object sender, EventArgs e)
    {
        FileInfo fInfo = new FileInfo(this.txtFile.Text);
        if (fInfo.Exists == false)
        {
            MessageBox.Show("文件不存在!");
            return;
        }
        DirectoryInfo dInfo = new DirectoryInfo(this.txtFolder.Text);
        if (dInfo.Exists == false)
        {
            MessageBox.Show("文件夾不存在!");
            return;
        }
        string[] arrName = this.txtFile.Text.Split('\\');
        string name = arrName[arrName.Length - 1];
        string newFileName = this.txtFolder.Text + "\\" + name;
        FileInfo deskFile = new FileInfo(newFileName);
        if (deskFile.Exists == true)
        {
            //方案一:提示用戶有重名文件
            //MessageBox.Show("目標位置有重名文件!");
            //return;
    
            //方案二:直接將目標文件刪除
            deskFile.Delete();
        }
        fInfo.MoveTo(newFileName);
        MessageBox.Show("移動成功!");
    }
    //刪除文件
    private void btDelete_Click(object sender, EventArgs e)
    {
        FileInfo fInfo = new FileInfo(this.txtFile.Text);
        if (fInfo.Exists == false)
        {
            MessageBox.Show("文件不存在!");
            return;
        }
        fInfo.Delete();
        MessageBox.Show("刪除成功!");
    }

    (2)文件夾常用操作

    Directory類是靜態類,其中所有方法都是靜態的,通過類名直接調用。

    示例,如下圖,進行文件夾的基本操作:

    C#怎么開發Winform實現文件操作

    點擊"選擇文件夾一"按鈕,選擇文件夾,并把文件夾路徑顯示在第一個文本框。

    點擊"選擇文件夾二"按鈕,選擇文件夾,并把文件夾路徑顯示在第二個文本框。

    點擊"移動文件夾"按鈕,將第一個文本框路徑的文件夾移動到第二個文本框路徑的文件夾下。

    點擊"刪除文件夾"按鈕,將第一個文本框路徑的文件夾進行刪除。

    其中"選擇文件夾一"按鈕name=btOpen1,"選擇文件夾二"按鈕name=btOpen2,"移動文件夾"按鈕name=btMove,"刪除文件夾"按鈕name=btDelete。

    第一個文本框name=txtFolder1,第二個文本框name=txtFolder2。

    文件對話框name=openFileDialog1,文件夾對話框name=folderBrowserDialog1。

    Directory實現代碼如下:

    //選擇文件夾一
    private void btOpen1_Click(object sender, EventArgs e)
    {
        if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)
        {
            this.txtFolder1.Text = this.folderBrowserDialog1.SelectedPath;
        }
    }
    //選擇文件夾二
    private void btOpen2_Click(object sender, EventArgs e)
    {
        if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)
        {
            this.txtFolder2.Text = this.folderBrowserDialog1.SelectedPath;
        }
    }
    //移動文件夾
    private void btMove_Click(object sender, EventArgs e)
    {
        if (!Directory.Exists(this.txtFolder1.Text) || !Directory.Exists(this.txtFolder2.Text))
        {
            MessageBox.Show("文件夾不存在!");
            return;
        }
        //獲取文件夾名稱
        string[] arrFolderName = this.txtFolder1.Text.Split('\\');
        string folderName = arrFolderName[arrFolderName.Length - 1];
        string newFolderName = this.txtFolder2.Text + "\\" + folderName;
        //判斷目標地址是否已經有該文件夾了
        if (Directory.Exists(newFolderName))
        {
            //方案一:給出提示
            //MessageBox.Show("在目標位置,該文件夾已經存在了");
            //return;
    
            //方案二:刪除目標位置的文件夾
            Directory.Delete(newFolderName,true);
        }
        //此移動操作只能在同一個根盤符上操作
        Directory.Move(this.txtFolder1.Text, newFolderName);
        MessageBox.Show("移動文件夾成功!");
    }
    
    private void btDelete_Click(object sender, EventArgs e)
    {
        if (!Directory.Exists(this.txtFolder1.Text))
        {
            MessageBox.Show("文件夾不存在!");
            return;
        }
        //第二個參數代表刪除所有的子文件夾和文件
        Directory.Delete(this.txtFolder1.Text, true);
        MessageBox.Show("刪除文件夾成功!");
    }

    同樣上述功能,使用DirectoryInfo實現如下:

    //選擇文件夾一
    private void btOpen1_Click(object sender, EventArgs e)
    {
        if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)
        {
            this.txtFolder1.Text = this.folderBrowserDialog1.SelectedPath;
        }
    }
    //選擇文件夾二
    private void btOpen2_Click(object sender, EventArgs e)
    {
        if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)
        {
            this.txtFolder2.Text = this.folderBrowserDialog1.SelectedPath;
        }
    }
    //移動文件夾
    private void btMove_Click(object sender, EventArgs e)
    {
        DirectoryInfo startInfo = new DirectoryInfo(this.txtFolder1.Text);
        DirectoryInfo endInfo = new DirectoryInfo(this.txtFolder2.Text);
        if (startInfo.Exists == false || endInfo.Exists == false)
        {
            MessageBox.Show("文件夾不存在");
            return;
        }
        string[] arrFolderName = this.txtFolder1.Text.Split('\\');
        string folderName = arrFolderName[arrFolderName.Length - 1];
        string newFolderName = this.txtFolder2.Text + "\\" + folderName;
        //判斷目標地址是否已經有該文件夾了
        DirectoryInfo tmp = new DirectoryInfo(newFolderName);
        if (tmp.Exists == true)
        {
            //方案一:給出提示
            //MessageBox.Show("在目標位置,該文件夾已經存在了");
            //return;
            //方案二:刪除目標位置的文件夾
            tmp.Delete(true);
        }
        //此移動操作只能在同一個根盤符上操作
        startInfo.MoveTo(newFolderName);
        MessageBox.Show("移動成功!");
    }
    
    private void btDelete_Click(object sender, EventArgs e)
    {
        DirectoryInfo startInfo = new DirectoryInfo(this.txtFolder1.Text);
        if (startInfo.Exists == false)
        {
            MessageBox.Show("文件夾不存在");
            return;
        }
        //參數代表刪除所有的子文件夾和文件
        startInfo.Delete(true);
        MessageBox.Show("刪除文件夾成功!");
    }

    (3)文件夾的復制和移動

    關于文件夾的移動,系統提供給我們的功能,只能在同一個根盤符上操作。

    關于文件夾的復制,系統根本就沒有提供相應的API。

    所以關于文件夾的復制以及文件移動跨磁盤只能自己寫,自己實現了,如圖:

    C#怎么開發Winform實現文件操作

    點擊"選擇文件夾一"按鈕:可以選擇一個文件夾,并且將文件夾的路徑顯示在第一個文本框。

    點擊"選擇文件夾二"按鈕:可以選擇一個文件夾,并且將文件夾的路徑顯示在第二個文本框。

    點擊"復制文件夾"按鈕:將第一個文件夾及文件夾內容復制到第二個文件夾中。

    點擊"移動文件夾"按鈕:將第一個文件夾及文件夾內容移動到第二個文件夾中。

    其中:"選擇文件夾一"按鈕name=btOpen1,"選擇文件夾二"按鈕name=btOpen2,"復制文件夾"按鈕name=btCopy,"移動文件夾"按鈕name=btMove。

    第一個文本框name=txtFolder1,第二個文本框name=txtFolder2。

    文件對話框name=openFileDialog1,文件夾對話框name=folderBrowserDialog1。

    具體實現代碼如下:

    編寫通用的遞歸方法,實現文件夾的復制:

    //endFolderPath為處理之后的目標路徑
    //例如將"C:\abc"復制到"D:123\",endFolderPath需要傳遞處理之后的"D:123\abc"
    private void CopyFolder(string startFolderPath, string endFolderPath)
    {
        //在創建目標文件夾
        Directory.CreateDirectory(endFolderPath);
        DirectoryInfo startDir = new DirectoryInfo(startFolderPath);
        //循環復制文件夾下的所有文件
        foreach (FileInfo item in startDir.GetFiles())
        {
            File.Copy(item.FullName, endFolderPath + "\\" + item.Name);
        }
        //循環所有子文件夾形成遞歸調用
        foreach (DirectoryInfo item in startDir.GetDirectories())
        {
            string startPath = item.FullName;
            string newFolderName = endFolderPath + "\\" + item.Name;
            CopyFolder(startPath, newFolderName);
        }
    }

    各個按鈕的代碼如下:

    private void btOpen1_Click(object sender, EventArgs e)
    {
        if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)
        {
        	this.txtFolder1.Text = this.folderBrowserDialog1.SelectedPath;
        }
    }
    
    private void btOpen2_Click(object sender, EventArgs e)
    {
        if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)
        {
        	this.txtFolder2.Text = this.folderBrowserDialog1.SelectedPath;
        }
    }
    //復制文件夾
    private void btCopy_Click(object sender, EventArgs e)
    {
        if (!Directory.Exists(this.txtFolder1.Text) || !Directory.Exists(this.txtFolder2.Text))
        {
            MessageBox.Show("文件夾不存在!");
            return;
        }
        string[] arrFolderName = this.txtFolder1.Text.Split('\\');
        string folderName = arrFolderName[arrFolderName.Length - 1];
        string newFolderName = this.txtFolder2.Text + "\\" + folderName;
        //判斷目標地址是否已經有該文件夾了
        if (Directory.Exists(newFolderName))
        {
            //方案一:給出提示
            //MessageBox.Show("在目標位置,該文件夾已經存在了");
            //return;
    
            //方案二:刪除目標位置的文件夾
            Directory.Delete(newFolderName, true);
        }
        CopyFolder(this.txtFolder1.Text, newFolderName);
        MessageBox.Show("復制成功!");
    }
    
    //移動文件夾
    private void btMove_Click(object sender, EventArgs e)
    {
        if (!Directory.Exists(this.txtFolder1.Text) || !Directory.Exists(this.txtFolder2.Text))
        {
            MessageBox.Show("文件夾不存在!");
            return;
        }
        string[] arrFolderName = this.txtFolder1.Text.Split('\\');
        string folderName = arrFolderName[arrFolderName.Length - 1];
        string newFolderName = this.txtFolder2.Text + "\\" + folderName;
        //判斷目標地址是否已經有該文件夾了
        if (Directory.Exists(newFolderName))
        {
            //方案一:給出提示
            //MessageBox.Show("在目標位置,該文件夾已經存在了");
            //return;
    
            //方案二:刪除目標位置的文件夾
            Directory.Delete(newFolderName, true);
        }
        CopyFolder(this.txtFolder1.Text, newFolderName);
        //復制完成后,刪除原始位置的文件夾
        Directory.Delete(this.txtFolder1.Text, true);
        MessageBox.Show("移動成功!");
    }

    三、讀寫文本文件

    文件和流的概念:

    --文件是在各種媒質上永久存儲的數據的有序集合。它是進行數據讀寫操作的基本對象。

    --流是一種向存儲器讀取和寫入字節的方式,也是進行數據讀寫操作的基本對象。

    --流提供了連續的字節流存儲空間,其實際存儲位置可以不連續。

    --C#中所有表示流的類都繼承于抽象類Stream。

    讀寫文本文件最常用的類有:

    --FileStream(文件流)

    --StreamReader(流讀取器)

    --StreamWriter(流寫入器)

    讀寫文件操作的基本步驟為:
    • 創建文件流

    • 創建讀、寫器

    • 執行讀、寫操作

    • 關閉讀寫器

    • 關閉文件流

    文件流對象:

    實例化文件流對象語法如下:

    FileStream fs = new FileStream(FileName, FileMode,FileAccess);

    其中FileMode的枚舉值如下:

    值名稱功能說明
    CreateNew創建新文件,如果文件已存在則引發異常
    Create創建新文件,如果文件已存在則覆蓋
    Open打開文件,如果文件不存在則引發異常
    OpenOrCreate打開文件,如果文件不存在則創建新文件
    Append打開文件并查找到文件尾,如果文件不存在則創建新文件
    Truncate打開現在文件并清除其內容,如果文件不存在則引發異常

    其中FileAccess的枚舉值如下:

    值名稱功能說明
    Read對文件進行只讀訪問
    Write對文件進行只寫訪問
    ReadWrite對文件進行讀寫訪問
    文件讀寫器常用方法:

    StreamReader的常用方法:

    值名稱功能說明
    Read讀取輸入流中的下一個(組)字符
    ReadLine讀取當前流中的一行字符,并將數據作為字符串返回
    ReadToEnd讀取從當前位置到末尾的所有字符,并將數據作為字符串返回
    Close關閉StreamReader對象和基礎流,并釋放與讀取器關聯的所有系統資源

    StreamWriter的常用方法:

    值名稱功能說明
    Write將數據寫入流
    WriteLine將行結束符之前的數據寫入流
    Close關閉StreamWriter對象和基礎流

    示例:如下圖,編寫一個文本文件讀寫器

    C#怎么開發Winform實現文件操作

    --點擊"打開文件"按鈕,選擇一個文本文件,并且將文本文件路徑顯示在上面單行文本框中,將文本文件的內容顯示在下面的多行文本框中。

    --多行文本框,可以進行修改其文本內容。

    --點擊"保存文件"按鈕,將多行文本框的文本保存到打開的文本文件中。

    其中"打開文件"按鈕name=btOpen,"保存文件"按鈕name=btSave,單行文本框name=txtFilePath,多行文本框name=txtContent。

    實現代碼如下:

    private void btOpen_Click(object sender, EventArgs e)
    {
        OpenFileDialog dialog = new OpenFileDialog();
        DialogResult result = dialog.ShowDialog();
        //點擊打開按鈕之后
        if (result == System.Windows.Forms.DialogResult.OK)
        {
            this.txtFilePath.Text = dialog.FileName;
        }
        else
        {
        	return;
        }    
        //方案一:使用Filestream將文本一次性全部轉換為字節數組,之后轉換為string
        //FileStream fs = new FileStream(this.txtFilePath.Text, FileMode.Open, FileAccess.Read);
        ////fs.Seek(0, SeekOrigin.Begin); //定位流,從開始位置移動0個字節,也就是流的最開始位置
        //int len = (int)fs.Length; //獲取文件的字節長度 
        //byte[] arrByte = new byte[len]; //定義字節數組
        //fs.Read(arrByte, 0, arrByte.Length); //將文件流讀入字節數組
        //this.txtContent.Text = Encoding.Default.GetString(arrByte,0,len);
        //fs.Close();
    
        //方案二:使用Filestream,逐字節讀取文本,后將字節轉換為string
        //FileStream fs = new FileStream(this.txtFilePath.Text, FileMode.Open, FileAccess.Read);
        //int len = (int)fs.Length; //獲取文件的字節長度 
        //byte[] arrByte = new byte[len]; //定義字節數組
        //int index = 0; //保存字節數組變化的下標
        //int code = fs.ReadByte(); //讀取一個字節
        //while (code != -1) //讀取內容等于-1即表示讀取完畢
        //{
        //    //將讀取內容轉換成字節存入數組
        //    arrByte[index] = Convert.ToByte(code); 
        //    code = fs.ReadByte();  //繼續逐字節讀取
        //    index++;
        //}
        //this.txtContent.Text = Encoding.Default.GetString(arrByte, 0, len);
        //fs.Close();
    
    	//方案三:直接使用File的Read All Text 函數將文本文件內容全部讀入text
    	//File.ReadAllBytes可以讀取成字節數組
    	//this.txtContent.Text = File.ReadAllText(this.txtFilePath.Text, Encoding.Default);
    
        //方案四:使用StreamReader流讀取器讀取
        FileStream fs = new FileStream(this.txtFilePath.Text, FileMode.Open, FileAccess.Read);
        StreamReader sd = new StreamReader(fs, Encoding.Default);
        //這里可以逐行讀入
        //string line = sd.ReadLine();
        //while (line != null)
        //{
        //    this.txtContent.Text = this.txtContent.Text + line + "\r\n";
        //    line = sd.ReadLine();
        //}
        //也可以全部讀入
        this.txtContent.Text = sd.ReadToEnd();
        sd.Close();
        fs.Close();
    }
    
    private void btSave_Click(object sender, EventArgs e)
    {
        //方案一:File類靜態方法
        //File.WriteAllText(this.txtFileName.Text, this.txtContent.Text,Encoding.Default);
        //MessageBox.Show("保存成功!");
    
        //方案二:使用StreamWriter流寫入器
        FileStream fs = new FileStream(this.txtFileName.Text, FileMode.Open, FileAccess.Write);
        StreamWriter sw = new StreamWriter(fs, Encoding.Default);
        sw.Write(this.txtContent.Text);
        sw.Close();
        fs.Close();
        MessageBox.Show("保存成功!");
    }

    四、序列化與反序列化

    序列化就是將對象實例的狀態存儲到存儲媒介的過程。

    序列化和反序列化的實現步驟(二進制序列化):

    • (1)引入System.Runtime.Serialization.Formatters.Binary命名空間

    • (2)要序列化的對象需要標記Serializable特性

    • (3)其父類和屬性中的引用類型也標記Serializable特性

    • (4)使用BinaryFormatter 對象的Serialize()方法和Deserialize()方法

    (1)序列化單個對象

    示例:如下圖,實現單個對象的序列化與反序列化

    C#怎么開發Winform實現文件操作

    --輸入學生信息,點擊"保存信息"按鈕,將學生信息永久序列化保存到電腦上。

    --關閉程序后,在啟動程序,可以將本地序列化文件讀取,將信息顯示在界面的文本框中。

    其中,學號,姓名,年齡文本框的name分別為txtNo,txtName,txtAge。

    保存信息和讀取信息按鈕name分別為btSave和btRead。

    具體實現代碼如下:

    定義一個學生類:

    [Serializable]
    class Student
    {
        public string StuNo { get; set; } //學號
        public string StuName { get; set; } //姓名
        public int StuAge { get; set; } //年齡
    }

    其中[Serializable]關鍵字代表此類是可以被序列化的。

    編寫按鈕響應事件代碼:

    private void btSave_Click(object sender, EventArgs e)
    {
        Student stu = new Student();
        stu.StuNo = this.txtNo.Text;
        stu.StuName = this.txtName.Text;
        stu.StuAge = int.Parse(this.txtAge.Text);
    
        FileStream fs = new FileStream("stu.ini", FileMode.Create, FileAccess.ReadWrite);
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(fs, stu);  //序列化
        fs.Close();
        MessageBox.Show("保存成功!");
    }
    
    private void btRead_Click(object sender, EventArgs e)
    {
        FileStream fs = new FileStream("stu.ini", FileMode.Open, FileAccess.ReadWrite);
        BinaryFormatter bf = new BinaryFormatter();
        Student stu = bf.Deserialize(fs) as Student;  //反序列化
        this.txtNo.Text = stu.StuNo;
        this.txtName.Text = stu.StuName;
        this.txtAge.Text = stu.StuAge.ToString();
        fs.Close();
    }

    (2)序列化集合

    示例:如下圖,實現集合的序列化

    C#怎么開發Winform實現文件操作

    --打開窗體,自動從序列化文件中讀取信息,并在listView列表上進行展示。

    --輸入學生信息,點擊"添加信息"按鈕,添加學生,并且序列化學生列表,刷新ListView列表數據。

    其中展示列表的ListView控件的name=listView1。

    學號,姓名,年齡文本框的name分別為txtNo,txtName,txtAge。

    添加信息按鈕name=btSave。

    具體實現代碼如下:

    定義一個學生類:

    [Serializable]
    class Student
    {
        public string StuNo { get; set; } //學號
        public string StuName { get; set; } //姓名
        public int StuAge { get; set; } //年齡
    }

    其中[Serializable]關鍵字代表此類是可以被序列化的。

    編寫按鈕響應事件代碼:

    List<Student> list = new List<Student>();
    private void BindData()
    {
        if (!File.Exists("list.ini"))
            return;
        //讀取序列化文件
        FileStream fs = new FileStream("list.ini", FileMode.Open, FileAccess.ReadWrite);
        BinaryFormatter bf = new BinaryFormatter();
        list = bf.Deserialize(fs) as List<Student>;  //反序列化
        fs.Close();
        //將list集合數據綁定到ListView控件
        this.listView1.Items.Clear();
        foreach (Student stu in list)
        {
            ListViewItem item = new ListViewItem(stu.StuNo);
            item.SubItems.Add(stu.StuName);
            item.SubItems.Add(stu.StuAge.ToString());
            this.listView1.Items.Add(item);
        }
    }
    
    private void Form2_Load(object sender, EventArgs e)
    {
        BindData();
    }
    
    private void btSave_Click(object sender, EventArgs e)
    {
        Student stu = new Student();
        stu.StuNo = this.txtNo.Text;
        stu.StuName = this.txtName.Text;
        stu.StuAge = int.Parse(this.txtAge.Text);
        list.Add(stu);
        FileStream fs = new FileStream("list.ini", FileMode.Create, FileAccess.ReadWrite);
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(fs, list);  //序列化
        fs.Close();
        MessageBox.Show("保存成功!");
        BindData();
    }

    關于“C#怎么開發Winform實現文件操作”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C#怎么開發Winform實現文件操作”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    汉川市| 大宁县| 福泉市| 瑞丽市| 南宁市| 康定县| 彝良县| 津市市| 宁津县| 鸡西市| 武乡县| 清镇市| 监利县| 哈巴河县| 麻栗坡县| 平度市| 三穗县| 历史| 漳州市| 泽库县| 论坛| 周宁县| 湘乡市| 平昌县| 明水县| 德化县| 拜泉县| 虞城县| 稻城县| 昌宁县| 宜黄县| 新密市| 大兴区| 清水县| 梁平县| 霞浦县| 永济市| 霍城县| 三明市| 马龙县| 林西县|