--- tags: 視窗程式設計 --- # 實作:記事本(RTF 格式文件儲存) 雖然我們已經可以修改文字樣式,但是如果你存檔,仍然只能儲存最基本的 txt 純文字格式文件。 接下來我們要跟同學介紹一種微軟所開發的跨平台 RTF 格式文件,大多數的文書處理軟體都能讀取和儲存 RTF 文件,你可以將具備各種樣式的文字儲存在這樣的文件裡面。 # 第一部分:介面設定 這次不需要改變介面,因此跳過。 # 第二部分:程式碼撰寫 ## 選單初始化 接下來將以下程式碼放到專案之中,請特別注意,方法 btnOpen_Click() 是開啟檔案按鍵的事件綁定程式,btnSave_Click() 則是儲存檔案按鍵的事件綁定程式。 再測試程式,你應該可以開啟與儲存 RTF 格式的檔案,你可以測試看看,開啟與儲存一個 RTF 檔案,並且可以用 WORD 來確認內容。 ```csharp= private void btnOpen_Click(object sender, EventArgs e) { // 設置對話方塊標題 openFileDialog1.Title = "選擇檔案"; // 設置對話方塊篩選器,限制使用者只能選擇特定類型的檔案 openFileDialog1.Filter = "RTF格式檔案 (*.rtf)|*.rtf|文字檔案 (*.txt)|*.txt|所有檔案 (*.*)|*.*"; // 如果希望預設開啟的檔案類型是文字檔案,可以這樣設置 openFileDialog1.FilterIndex = 1; // 如果希望對話方塊在開啟時顯示的初始目錄,可以設置 InitialDirectory openFileDialog1.InitialDirectory = "C:\\"; // 允許使用者選擇多個檔案 openFileDialog1.Multiselect = true; // 顯示對話方塊,並等待使用者選擇檔案 DialogResult result = openFileDialog1.ShowDialog(); // 檢查使用者是否選擇了檔案 if (result == DialogResult.OK) { try { // 使用者在OpenFileDialog選擇的檔案 string selectedFileName = openFileDialog1.FileName; // 獲取文件的副檔名 string fileExtension = Path.GetExtension(selectedFileName).ToLower(); // 判斷副檔名是甚麼格式 if (fileExtension == ".txt") { // 使用 using 與 FileStream 打開檔案 using (FileStream fileStream = new FileStream(selectedFileName, FileMode.Open, FileAccess.Read)) { // 使用 StreamReader 讀取檔案內容 using (StreamReader streamReader = new StreamReader(fileStream, Encoding.UTF8)) { // 將檔案內容顯示到 RichTextBox 中 rtbText.Text = streamReader.ReadToEnd(); } } } else if (fileExtension == ".rtf") { // 如果是RTF文件,使用RichTextBox的LoadFile方法 rtbText.LoadFile(selectedFileName, RichTextBoxStreamType.RichText); } } catch (Exception ex) { // 如果發生錯誤,用MessageBox顯示錯誤訊息 MessageBox.Show("讀取檔案時發生錯誤: " + ex.Message, "錯誤訊息", MessageBoxButtons.OK, MessageBoxIcon.Error); } } else { MessageBox.Show("使用者取消了選擇檔案操作。", "訊息", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation); } } ``` ```csharp= private void btnSave_Click(object sender, EventArgs e) { // 設置對話方塊標題 saveFileDialog1.Title = "儲存檔案"; // 設置對話方塊篩選器,限制使用者只能選擇特定類型的檔案 saveFileDialog1.Filter = "RTF格式檔案 (*.rtf)|*.rtf|文字檔案 (*.txt)|*.txt|所有檔案 (*.*)|*.*"; // 如果希望預設儲存的檔案類型是文字檔案,可以這樣設置 saveFileDialog1.FilterIndex = 1; // 如果希望對話方塊在開啟時顯示的初始目錄,可以設置 InitialDirectory saveFileDialog1.InitialDirectory = "C:\\"; // 顯示對話方塊,並等待使用者指定儲存的檔案 DialogResult result = saveFileDialog1.ShowDialog(); //建立 FileStream 物件 FileStream fileStream = null; // 檢查使用者是否選擇了檔案 if (result == DialogResult.OK) { try { // 使用者指定的儲存檔案的路徑 string saveFileName = saveFileDialog1.FileName; string extension = Path.GetExtension(saveFileName); // 使用 using 與 FileStream 建立檔案,如果檔案已存在則覆寫 using (fileStream = new FileStream(saveFileName, FileMode.Create, FileAccess.Write)) { if (extension.ToLower() == ".txt") { // 將 RichTextBox 中的文字寫入檔案中 byte[] data = Encoding.UTF8.GetBytes(rtbText.Text); fileStream.Write(data, 0, data.Length); } else if (extension.ToLower() == ".rtf") { // 將RichTextBox中的內容保存為RTF格式 rtbText.SaveFile(fileStream, RichTextBoxStreamType.RichText); } } MessageBox.Show("檔案儲存成功。", "訊息", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { // 如果發生錯誤,用 MessageBox 顯示錯誤訊息 MessageBox.Show("儲存檔案時發生錯誤: " + ex.Message, "錯誤訊息", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { // 關閉資源,如果使用 using 或者直接以 File.WriteAllText 儲存文字檔,可以不需要。 fileStream.Close(); } } else { MessageBox.Show("使用者取消了儲存檔案操作。", "訊息", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation); } } ```