пустое имя пути не разрешено - PullRequest
4 голосов
/ 28 февраля 2011

У меня есть кнопка «Сохранить», поэтому, когда пользователь нажимает, он выполняет сохранение файла XML (сериализация XML). Здесь используется savefiledialog, и когда я нажимаю кнопку «Отмена» без выбора какого-либо файла, возникает «Исключение аргумента» с сообщением «Пустое имя пути недопустимо». Как мне справиться с этим исключением? Я бы хотел, чтобы форма оставалась неизменной даже без выбора пути в файле savefiledialog. Большое спасибо.

Мой фрагмент savefiledialog:

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;
        ...
        using (Stream savestream = new FileStream(savepath, FileMode.Create))
        {
                XmlSerializer serializer = new XmlSerializer(typeof(FormSaving));
                serializer.Serialize(savestream, formsaving);
        }

}

В этой строке возникает исключение моего аргумента:

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

Ответы [ 2 ]

5 голосов
/ 28 февраля 2011

Проблема здесь в том, что вы не заботитесь о результате диалога Сохранить, и вы пытаетесь сохранить, даже если пользователь нажал Отмена.Вы должны изменить код так, чтобы он выглядел примерно так:

...
DialogSave.InitialDirectory = @"C:/";
if( DialogSave.ShowDialog() == DialogResult.OK )
{
  savepath = DialogSave.FileName;
  DialogSave = null;
  ...
  using (Stream savestream = new FileStream(savepath, FileMode.Create))
  {
     XmlSerializer serializer = new XmlSerializer(typeof(FormSaving));
     serializer.Serialize(savestream, formsaving);
  }
}
DialogSave.Dispose();
4 голосов
/ 28 февраля 2011

Вы, вероятно, не хотите сохранять, если пользователь отменяет диалог? Проверьте результат от ShowDialog и действуйте соответственно:

if (DialogSave.ShowDialog() == true)
{
    savepath = DialogSave.FileName;
            ...
    using (Stream savestream = new FileStream(savepath, FileMode.Create))
    {
        XmlSerializer serializer = new XmlSerializer(typeof(FormSaving));
        serializer.Serialize(savestream, formsaving);
    }
}
...