2016-05-19 58 views
0

所以我創建一個C#記事本,我差不多完成了,但是這是最後一個問題: 我不能保存文件。當我打開一個文件並對其進行修改並嘗試保存時,它給了我一個錯誤,說明該文件已被一個進程使用。我相信這個過程是由我的開放文件方法開始的,但我不確定。我確實有一個方法來保存打開一個保存文件對話框,但我想要一個不需要對話框,只需一個快速保存它,你可能明白我的意思。如何保存此文件?

我打開文件的方法

private void openItem_Click(object sender, EventArgs e) 
    { 
     Stream myStream; 
     OpenFileDialog openFileDialog1 = new OpenFileDialog(); 

     if (openFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      if ((myStream = openFileDialog1.OpenFile()) != null) 
      { 
       string srtfilename = openFileDialog1.FileName; 
       string filetext = File.ReadAllText(srtfilename); 
       GetRichTextBox().Text = filetext; 

       tabControl1.SelectedTab.Text = Path.GetFileName(openFileDialog1.FileName); 

       GlobalPath = openFileDialog1.FileName; 
      } 

      openFileDialog1.Dispose(); 
     } 

我保存文件的方法與對話,這一個工程,但如果我選擇,我已經使用的文件,它崩潰。

private void saveAsItem_Click(object sender, EventArgs e) 
    { 
     SaveFileDialog saveFileDialog1 = new SaveFileDialog(); 

     if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      using (Stream s = File.Open(saveFileDialog1.FileName, FileMode.Create)) 
      using (StreamWriter sw = new StreamWriter(s)) 
      { sw.Write(GetRichTextBox().Text); } 

      tabControl1.SelectedTab.Text = Path.GetFileName(saveFileDialog1.FileName); 

      saveFileDialog1.Dispose(); 
     } 
    } 

快速保存文件的方法,則有問題,一個IM。這是我到目前爲止所嘗試過的。

private void saveToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     string texto, nome, local; 
     nome = tabControl1.SelectedTab.Text; 
     texto = GetRichTextBox().Text; 
     tabControl1.TabPages.Remove(tabControl1.SelectedTab); 
     NewText(); 
     GetRichTextBox().Text = texto; 
     tabControl1.SelectedTab.Text = nome; 

     local = nome + ".txt"; 

     using (StreamWriter sw = new StreamWriter(GlobalPath, true)) 
     { sw.Write(texto); } 

    // tabControl1.SelectedTab.Text = Path.GetFileName(saveFileDialog1.FileName); 
    } 
+1

爲什麼你不調試你的應用程序,看看拋出的異常? – Fang

+0

@Fang更容易在這裏發佈一個問題我猜... –

+0

@Fang在這裏拋出的異常並不告訴你擁有的過程是什麼,只有其他東西擁有該文件並自己去找。當然,如果包含使用流打開文件的上下文,該解決方案仍然是可發現的,但僅僅是例外是不夠的。 – Diosjenin

回答

5

打開和讀取文件的方法過於複雜,我認爲這是問題的根源。你將留下一個Stream對象未處理。任何實現IDisposable的東西都應該包含在using聲明中或明確處置。

這裏有一個更好的實現你打開文件的方法:

private void openItem_Click(object sender, EventArgs e) 
{ 
    using (var openFileDialog1 = new OpenFileDialog()) 
    { 
     if (openFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      try { 
       string srtfilename = openFileDialog1.FileName; 
       string filetext = File.ReadAllText(srtfilename); 
       GetRichTextBox().Text = filetext; 

       tabControl1.SelectedTab.Text = Path.GetFileName(openFileDialog1.FileName); 

       GlobalPath = openFileDialog1.FileName; 
      } 
      catch (Exception ex) 
      { 
       // you may wish to log the entire exception including stack trace here 
       MessageBox.Show(ex.Message); 
      } 
     } 
    } 
} 

你不需要流只是爲了檢查文件是否存在。而現在你不會留下任何不公開的資源。

您也可以使用if (File.Exists(strfilename))來檢查文件是否存在,或者不檢查,因爲如果文件不存在,FileOpenDialog實際上會默認警告用戶(我認爲)。

您應該堅持使用File.ReadAllTextFile.WriteAllText:不需要爲簡單的文本編輯器直接搞亂Stream對象,而且它更簡潔,併爲您留下更簡單的代碼。

+0

我唯一要添加到這個答案的是'FileNotFoundException'遠不是唯一可以拋出'File.ReadAllText()'的異常(參見[here](https://msdn.microsoft.com/en- us/library/ms143368%28v = vs.110%29.aspx)作爲詳盡的列表)。每個異常類型應該有多個catch塊,每個都會顯示一條唯一的消息,或者一個塊捕獲一個泛型「Exception」並顯示包含的ex.Message。 – Diosjenin

+0

@Diosjenin是的,你當然是對的。編輯。 – Blorgbeard

+0

非常感謝,它的工作完美無瑕。 –