《windows應用高級編程-C#編程篇》書中程序的小問題及改進
2024-07-21 02:18:22
供稿:網友
清華大學出版社《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;
完