2017-01-24 35 views
0

Я делаю текстовый редактор в C# и недавно добавил функциональность для тихого сохранения файла (без SaveFileDialog). Файл выглядит правильно, но при попытке открыть файл я получаю сообщение об ошибке System.ArgumentException - File format is not valid. Он отлично открывается, если файл не был сохранен без помех.Ошибка при открытии (молча) сохраненного файла C#

Код:

способа сохранения:

public void save(RichTextBoxPrintCtrl.RichTextBoxPrintCtrl rtbIn, string fileNameIn) 
    { 
     string fileName = ""; 
     if (getFileFromMap(fileNameIn) != "") 
     { 
      // The file already exists in the Map so save it 
      fileName = getFileFromMap(fileNameIn); 
      StreamWriter writer = new StreamWriter(fileName); 
      writer.Write(rtbIn.Text); 
      writer.Close(); 
     } 
     else 
     { 
      // The file does not exist in the Map so 
      // Send it to SaveAs with the rtb and the initial fileName passed in 
      saveAs(rtbIn, fileNameIn); 
     } 

    } 

Примерчик:

public string saveAs(RichTextBoxPrintCtrl.RichTextBoxPrintCtrl rtbIn, string fileName) 
    { 
     saveDialog.FileName = fileName; 
     saveDialog.Title = "Save As"; 

     if (saveDialog.ShowDialog() == DialogResult.OK) 
     { 
      if (saveDialog.FileName.Length > 0) 
      { 
       if (saveDialog.FileName.EndsWith(".rtf")) 
       { 
        rtbIn.SaveFile(saveDialog.FileName, RichTextBoxStreamType.RichText); 
       } 
       else 
       { 
        rtbIn.SaveFile(saveDialog.FileName, RichTextBoxStreamType.PlainText); 
       } 
       addFileToMap(fileName, saveDialog.FileName); 
       return Path.GetFileName(saveDialog.FileName); 
      } 
      else { return ""; } 
     } 
     else { return ""; } 
    } 

и Open:

public string open(RichTextBoxPrintCtrl.RichTextBoxPrintCtrl rtbIn) 
    { 
     if (openDialog.ShowDialog() == DialogResult.OK) 
     { 
      if (openDialog.FileName.Length > 0) 
      { 
       string fileName = Path.GetFileName(openDialog.FileName); 

       if (fileName.EndsWith(".rtf")) 
       { 
        rtbIn.LoadFile(openDialog.FileName, RichTextBoxStreamType.RichText); 
       } 
       else 
       { 
        rtbIn.LoadFile(openDialog.FileName, RichTextBoxStreamType.PlainText); 
       } 
       addFileToMap(openDialog.FileName, openDialog.FileName); 
       return fileName; 
      } 
      else { return ""; } 
     } 
     else { return ""; } 
    } 

Другая информация:

  • Имена файлов хранятся в словаре, потому что у редактора есть вкладки.
  • RichTextBoxPrintCtrl обычай RichTextBox, который поддерживает печать, это ничего не меняет отношение к открытию
  • Методы выше в отдельный класс, и именно поэтому они требуют RichTextBox быть переданы в.

Если вам нужен какой-либо другой код, просто дайте мне знать. Любой совет будет оценен! Заранее спасибо :)

EDIT: Исправлено, не удалось использовать StreamWriter.

+0

Как в стороне, сейчас самое подходящее время, чтобы начать следовать соглашениям об именовании .NET, используя инструкции 'using' и узнав о таких методах, как' File.WriteAllText'. –

+0

@ JonSkeet Вы имеете в виду столицу, чтобы начать имена? Я пишу так, потому что я привык к Java-именованию ... Я постараюсь начать следовать соглашениям :) – criticaldiamonds

+0

Да, точно. Я знаю, что есть соблазн придерживаться ваших предыдущих соглашений, но действительно стоит приложить усилия, чтобы следовать конвенциям на языке, который вы на самом деле используете. –

ответ

1

Ну, похоже, проблема заключается в том, что вы не сохраняете файл таким же образом.

Когда вы выполняете команду saveAs, вы вызываете rtb.SaveFile. В вашем тихом save вы непосредственно пытаетесь сохранить файл rtb.Text, но это, вероятно, неверный формат. rtb.OpenFile ожидает.

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

Чтобы расширить немного, Text возвращает только обычный текст (информация о форматировании содержимого). Ваш метод save сохраняет как обычный текст любой файл, даже если его .rtf. С другой стороны, ваш метод Open попытается открыть файл .rtf в виде отформатированного текста, это может вызвать проблемы, которые возникают у вас.

+0

Спасибо! Я не понимал, что не могу использовать StreamWriter – criticaldiamonds