您好,登錄后才能下訂單哦!
這篇文章主要介紹了C#怎么開發Winform實現文件操作的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C#怎么開發Winform實現文件操作文章都會有所收獲,下面我們一起來看看吧。
C#中共有三種文件對話框,分別用于不同的功能:
(1)用于打開文件的對話框OpenFileDialog。
(2)用于保存文件的對話框SaveFileDialog。
(3)打開文件夾的對話框FolderBroswerDialog。
示例:如下圖,點擊三個按鈕分別彈出三種對話框,進行相應操作之后,將路徑在文本框中顯示:
修改OpenFileDialog對話框的Name屬性為ofDlg。在“打開”按鈕添加ofDlg.ShowDialog(); 界面如下:
通過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 | 在對話框返回之前,檢查指定路徑是否存在 |
保存文件對話框常用于軟件中的“另存為”功能。其常用屬性、方法及使用方式與打開文件對話框相同。
設置保存文件對話框的Filter屬性為“文本文件|*.txt”。在“保存”按鈕的點擊事件中編寫如下代碼:
private void btnSave_Click(object sender, EventArgs e) { if (sfDlg.ShowDialog() == DialogResult.OK) { txtPath.Text = sfDlg.FileName; } }
瀏覽文件夾對話框常用于瀏覽文件夾,選擇文件夾路徑。
在“瀏覽”按鈕的點擊事件中編寫如下代碼:
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類用于對文件進行常用操作管理。
在C#中如果對文件進行創建、復制和刪除等少量操作一般使用File類。
File類是靜態類,其中所有方法都是靜態的,通過類名直接調用,不需要實例化。
示例,如下圖,進行文件的基本操作:
點擊"選擇文件"按鈕選擇某個文件,并將文件路徑在文本框顯示。
點擊"選擇文件夾"按鈕選擇某個文件夾,并將文件夾路徑在文本框顯示。
點擊"復制文件"按鈕,實現將文件復制到文件夾中。
點擊"移動文件"按鈕,實現將文件移動到文件夾中。
點擊"刪除文件"按鈕,實現將文件刪除。
其中,"選擇文件"按鈕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("刪除成功!"); }
Directory類是靜態類,其中所有方法都是靜態的,通過類名直接調用。
示例,如下圖,進行文件夾的基本操作:
點擊"選擇文件夾一"按鈕,選擇文件夾,并把文件夾路徑顯示在第一個文本框。
點擊"選擇文件夾二"按鈕,選擇文件夾,并把文件夾路徑顯示在第二個文本框。
點擊"移動文件夾"按鈕,將第一個文本框路徑的文件夾移動到第二個文本框路徑的文件夾下。
點擊"刪除文件夾"按鈕,將第一個文本框路徑的文件夾進行刪除。
其中"選擇文件夾一"按鈕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("刪除文件夾成功!"); }
關于文件夾的移動,系統提供給我們的功能,只能在同一個根盤符上操作。
關于文件夾的復制,系統根本就沒有提供相應的API。
所以關于文件夾的復制以及文件移動跨磁盤只能自己寫,自己實現了,如圖:
點擊"選擇文件夾一"按鈕:可以選擇一個文件夾,并且將文件夾的路徑顯示在第一個文本框。
點擊"選擇文件夾二"按鈕:可以選擇一個文件夾,并且將文件夾的路徑顯示在第二個文本框。
點擊"復制文件夾"按鈕:將第一個文件夾及文件夾內容復制到第二個文件夾中。
點擊"移動文件夾"按鈕:將第一個文件夾及文件夾內容移動到第二個文件夾中。
其中:"選擇文件夾一"按鈕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對象和基礎流 |
示例:如下圖,編寫一個文本文件讀寫器
--點擊"打開文件"按鈕,選擇一個文本文件,并且將文本文件路徑顯示在上面單行文本框中,將文本文件的內容顯示在下面的多行文本框中。
--多行文本框,可以進行修改其文本內容。
--點擊"保存文件"按鈕,將多行文本框的文本保存到打開的文本文件中。
其中"打開文件"按鈕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()方法
示例:如下圖,實現單個對象的序列化與反序列化
--輸入學生信息,點擊"保存信息"按鈕,將學生信息永久序列化保存到電腦上。
--關閉程序后,在啟動程序,可以將本地序列化文件讀取,將信息顯示在界面的文本框中。
其中,學號,姓名,年齡文本框的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(); }
示例:如下圖,實現集合的序列化
--打開窗體,自動從序列化文件中讀取信息,并在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實現文件操作”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。