2011-02-23 54 views
2

我有以下用於序列化標籤內容的代碼。當我按下「保存」按鈕時,會生成一個xml文件。當我在選擇相同的xml文件後按下「load」按鈕時,出現錯誤,IOexception未處理,進程無法訪問文件'C:\ datasaved.xml',因爲它正在被另一個進程使用。我的代碼有什麼問題嗎? 謝謝。XML序列化IOexception未處理

public class FormSaving 
    { 
     private string major; 

     public string Majorversion 
     { 
      get; 

      set; 

     } 
    } 



    private void SaveButton_Click(object sender, RoutedEventArgs e) 
    { 
     string savepath; 
     SaveFileDialog DialogSave = new SaveFileDialog(); 
     // Default file extension 
     DialogSave.DefaultExt = "txt"; 
     // Available file extensions 
     DialogSave.Filter = "XML file (*.xml)|*.xml|All files (*.*)|*.*"; 
     // Adds a extension if the user does not 
     DialogSave.AddExtension = true; 
     // Restores the selected directory, next time 
     DialogSave.RestoreDirectory = true; 
     // Dialog title 
     DialogSave.Title = "Where do you want to save the file?"; 
     // Startup directory 
     DialogSave.InitialDirectory = @"C:/"; 
     DialogSave.ShowDialog(); 
     savepath = DialogSave.FileName; 
     DialogSave.Dispose(); 
     DialogSave = null; 

     FormSaving abc = new FormSaving(); 
     abc.Majorversion = MajorversionresultLabel.Content.ToString(); 
     FileStream savestream = new FileStream(savepath, FileMode.Create); 
     XmlSerializer serializer = new XmlSerializer(typeof(FormSaving)); 
     serializer.Serialize(savestream, abc); 
    } 

    private void LoadButton_Click(object sender, RoutedEventArgs e) 
    { 


     Stream checkStream = null; 
     Microsoft.Win32.OpenFileDialog DialogLoad = new Microsoft.Win32.OpenFileDialog(); 
     DialogLoad.Multiselect = false; 
     DialogLoad.Filter = "XML file (*.xml)|*.xml|All files (*.*)|*.*"; 
     if ((bool)DialogLoad.ShowDialog()) 
     { 
      try 
      { 
       if ((checkStream = DialogLoad.OpenFile()) != null) 
       { 
        loadpath = DialogLoad.FileName; 
       } 
      } 
      catch (Exception ex) 
      { 
       System.Windows.MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message); 
      } 
     } 
     else 
     { 
      System.Windows.MessageBox.Show("Problem occured, try again later"); 
     } 

     FormSaving abc; 
     FileStream loadstream = new FileStream(loadpath, FileMode.Open); 
     XmlSerializer serializer = new XmlSerializer(typeof(FormSaving)); 
     abc = (FormSaving)serializer.Deserialize(loadstream); 
     loadstream.Close(); 
     MajorversionresultLabel.Content = abc.Majorversion; 
    } 

回答

3

這是最直接的問題:

FileStream savestream = new FileStream(savepath, FileMode.Create); 
XmlSerializer serializer = new XmlSerializer(typeof(FormSaving)); 
serializer.Serialize(savestream, abc); 

你不關閉流,因此該文件不能被重新讀。使用using聲明:

using (Stream savestream = new FileStream(savepath, FileMode.Create)) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(FormSaving)); 
    serializer.Serialize(savestream, abc); 
} 

你應該採取同樣的做法時裝載文件爲好,而不是調用Close明確......你當前的代碼,如果反序列化時發生異常,你贏了」不要關閉流。

你是通過Dialog.OpenFile打開文件,但沒有關閉該流...爲什麼打擾它打開它兩次?只需從您打開的流中讀取即可。

最後(暫時)你捕捉到一個異常(一味地,不考慮,其中異常真的值得處理),但是不管怎麼說都是如此。如果您發現異常,則可能是該方法的最後一部分無法正確執行,因此您應該或者返回自己拋出另一個異常。

+0

你好jon飛碟,謝謝你的回覆。在對存儲和加載使用'using'語句之後,我仍然有同樣的問題。關於兩次開放流..我想知道它是否會工作,我只是有一個單一的流?比方說,用戶加載一個手動編輯的xml文件。編輯,對不起,我現在很困惑 – jeremychan 2011-02-23 07:40:08

+0

@jeremychan:如果用戶目前在另一個進程中打開文件,它可能會失敗,是的。你在這裏是這種情況嗎? – 2011-02-23 07:41:39

+0

對不起,我現在完全困惑..我該怎麼辦?我沒有很好的理解流 – jeremychan 2011-02-23 07:54:02