---
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);
}
}
```