《windows應用進階編程-C#編程篇》書中程式的小問題及改進
來源:互聯網
上載者:User
window|編程|程式|進階|問題 清華大學出版社《windows應用進階編程-C#編程篇》,2003年1月第1版,Benny Johansen & Matthew Reynolds等著,張哲峰譯,在第八章檔案操作中的一個記事本小程式,有三個小問題,其中兩個同性質問題
問題一:StreamReader streamReader=new StreamReader(fileStream); 當開啟的檔案是中文字元時,會出現亂碼。
當開啟檔案的同時,將讀取的檔案內容轉化為StreamReader類型,使用的是.NET平台預設的編碼方式,從而導致讀取時的編碼類別型不一致,最後的資料當然出現亂碼。
原句改為StreamReader streamReader=new StreamReader(fileStream,Encoding.Default); 就可以解決問題
本句中用Encoding.Default,表示採用文字檔中原有的編碼類別型編碼
問題二:
private void menuFileSave_Click(object sender, System.EventArgs e)
{
SaveFileWithName(m_FileName);
}
private void SaveFileWithName(string filePath)
{
if(filePath!=null)
{
SaveFile(filePath);
m_FileName=filePath;
SetModified(false);
}
else
{
saveFileDialog1.Filter="Text files(*.txt)|*.txt|All files(*.*)|*.*";
saveFileDialog1.FilterIndex=1;
saveFileDialog1.RestoreDirectory=true;
if(saveFileDialog1.ShowDialog()==DialogResult.OK)
{
SaveFile(saveFileDialog1.FileName);
m_FileName=saveFileDialog1.FileName;
SetModified(false);
}
}
}
當運行程式,而沒有開啟任何文字檔,在編輯後,如果選擇“檔案”-->“另存新檔”不會出現問題,當按“儲存”時將出現問題,提示“空路徑名是非法的”,這是因為在按“儲存”時,促發menuFileSave_Click事件,執行SaveFileWithName(m_FileName),但此時m_FileName為空白,因為沒有開啟過檔案,以至導致錯誤
解決的辦法很簡單,設定一變數,判斷是否開啟過檔案
private bool isOpened;
void SetOpened(bool m)
{
isOpened=m;
}
bool IsOpened()
{
return isOpened;
}
在開啟檔案時,SetOpened(true);
發生儲存檔案事件時,
private void menuFileSave_Click(object sender, System.EventArgs e)
{
if(IsOpened())
SaveFileWithName(m_FileName);
else
SaveFileWithName(null);
}
先判斷是否開啟過檔案,如果開啟過,則用SaveFileWithName(m_FileName);如果沒有開啟過,則SaveFileWithName(null),此時功能相當於“另存新檔”,將出現一個SaveFileDialog
問題三:case DialogResult.Yes: SaveFileWithName(m_FileName);
aCancelEventArgs.Cancel=false;
break;
運行程式,而沒有開啟過檔案,編輯後沒有儲存關閉時,將出現同2的錯誤提示,原因一樣,
改進為:case DialogResult.Yes: if(IsOpened())
SaveFileWithName(m_FileName);
else
SaveFileWithName(null);
aCancelEventArgs.Cancel=false;
break;
完