XML-сериализация IOexception была необработанной - PullRequest
2 голосов
/ 23 февраля 2011

У меня есть следующий код, используемый для сериализации содержимого метки.Когда я нажимаю кнопку «Сохранить», создается XML-файл.При нажатии кнопки «загрузить» после того, как я выбрал тот же XML-файл, произошла ошибка, исключение IOexception не удалось. Процесс не может получить доступ к файлу «C: \ datasaved.xml», поскольку он используется другим процессом.Что-то не так с моим кодом?Спасибо.

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;
    }

1 Ответ

3 голосов
/ 23 февраля 2011

Это самая насущная проблема:

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, но не закрыв этот поток ... и почемупотрудиться открыть его дважды?Просто прочитайте из потока, который вы открыли.

Наконец (на данный момент) вы ловите исключение (вслепую, без учета , с которыми исключениями действительно стоит попытаться обработать)но потом продолжаем независимо.Если вы поймали исключение, скорее всего, последняя часть метода не будет работать правильно, поэтому вам следует либо вернуть , либо вызвать другое исключение самостоятельно.

...