2010-08-23 40 views
0

我有一些代碼來保存文件一樣C#:我是否驗證文件類型和正確使用goto?

SaveFileDialog dialog = new SaveFileDialog(); 
dialog.Filter = "Text files|*.txt"; 

SaveDialog: 
if ((bool)dialog.ShowDialog()) { 
    if (System.IO.Path.GetExtension(dialog.FileName) != ".txt") { 
     MessageBox.Show("You must select a .txt file"); 
     dialog.FileName = ""; 
     goto SaveDialog; 
    } 
    File.WriteAllText(dialog.FileName, txtEditor.Text); 
} 

我讀,我不應該使用goto。我可以使用do/while並檢查是否選擇了有效的擴展名,但會添加大量不必要的代碼。我覺得這個整潔。還是有更好/更正確的方法?

+1

DialogResult不能轉換爲布爾值。 :P – Siege 2010-08-23 07:15:05

+0

經過這麼多年,我已經忘記了這個關鍵詞。 – 2010-08-23 07:20:44

+0

@Siege:在WPF中,ShowDialog()的結果是一個布爾值 – 2010-08-23 07:23:55

回答

5
using (SaveFileDialog dialog = new SaveFileDialog()) 
{ 
    dialog.Filter = "Text files|*.txt"; 
    while(dialog.ShowDialog() == DialogResult.OK) 
     if (System.IO.Path.GetExtension(dialog.FileName).ToLowerInvariant() != ".txt") 
      MessageBox.Show("You must select a.txt file"); 
     else // file is ok 
     { 
      File.WriteAllText(dialog.FileName, txtEditor.Text); 
      break; 
     } 
} 
+0

如果你不使用'while(true)',我會upvote這個答案。把下一個條件放到while-condition中,這很好。如果用戶按下取消,他不會保存該文件 – Scoregraphic 2010-08-23 07:24:21

+0

您是絕對正確的。修正了它......還添加了'使用'聲明,因爲布拉德利的回答暗示......好主意。 – Nissim 2010-08-23 07:34:37

+0

我收到一個錯誤,說使用中使用的類型必須隱式轉換爲'System.IDisposable'。也沒有'DialogResult.OK' – 2010-08-23 12:42:28

4

我建議如下:

using (SaveFileDialog dialog = new SaveFileDialog()) { 
    dialog.Filter = "Text files|*.txt"; 

    while (true) { 
     if (dialog.ShowDialog() == DialogResult.OK) { 
      if (!System.IO.Path.GetExtension(dialog.FileName).Equals(".txt", StringComparison.InvariantCultureIgnoreCase)) { 
       MessageBox.Show("You must select a .txt file"); 
      } 
      else { 
       File.WriteAllText(dialog.FileName, txtEditor.Text); 
       break; 
      }   
     } 
     else break; 
    } 
} 

雖然有正當理由使用goto語句,在這種情況下,可避免並用更可讀的解決方案所取代。

另請注意,您不應該將DialogResult(ShowDialog()的返回值)轉換爲bool。

+0

+1雖然那裏布爾有效在那裏做什麼? :-) 有關使用的好點,所以Dispose被正確調用。 – Steffen 2010-08-23 07:22:10

+0

我的錯誤,從一個早先的想法繼承下來。 – 2010-08-23 07:22:39

+0

這是我正在建議的解決方案。但說實話,雖然我不喜歡在另一種方法存在時看到'轉到',但無限循環在可讀性方面並不能提供更多。 – Siege 2010-08-23 07:26:34