2017-02-23 188 views
0

У меня есть два способа: saveFile и saveAsToFile. Первый должен перезаписать содержимое текущего существующего файла. В то время как второй должен сохранять как новый файл (если текущий не существует или пользователь просто хочет сделать копию.)C# Перезаписать текстовый файл - ничего не записывается в файл

Когда я использую метод saveAsToFile, он работает каждый раз. Когда я использую метод saveFile, он ничего не пишет. (Я вижу "Saved!" MessageBox, хотя.)

Вот мои методы:

public void saveFile(string[] inData, string inDataTitle) 
    { 
     //This method saves the file 
     SaveFileDialog savefile; 
     string trueFileName; 

     if (isStrArrayNotEmpty(inData)) { 
      //Only attempt to save the file if there is anything written in the textArea 

      if (f.getDocumentSavedStatus()) { 
       if (f.getDocumentChangedStatus()) { 
        savefile = new SaveFileDialog(); 

        if (inDataTitle.EndsWith("*")) { 
         //Remove the asterisk from the document name 

         savefile.FileName = inDataTitle.Substring(0, inDataTitle.Length - 1); 
        } 
        else { 
         savefile.FileName = inDataTitle; 
        } 

        StreamWriter sw = new StreamWriter(savefile.FileName, false); 
        foreach (string line in inData) { 
         sw.WriteLine(line); 
        } 
        sw.Flush(); 
        if (sw.BaseStream != null) 
         sw.BaseStream.Flush(); 
        sw.Close(); 

        /* 
        using (StreamWriter sw = new StreamWriter(savefile.FileName, false)) 
         foreach (string line in inData) { 
          sw.WriteLine(line); 
         } 
        */ 

        f.setDocumentName(string.Empty); 
        trueFileName = Path.GetFileName(savefile.FileName); 
        f.setDocumentName(trueFileName); 
        f.setDocumentSavedStatus(true); 
        f.setDocumentChangedStatus(false);  //Changes saved, status updated 

        MessageBox.Show("Saved!"); 
       } 
      } 
      else { 
       //If the document hasn't been saved before, send the values to the 'Save As' method 

       saveAsToFile(inData, inDataTitle); 
      } 
     } 
    } 

    public void saveAsToFile(string[] inData, string inDataTitle) 
    { 
     //This method checks if there is anything written in the texArea, 
     //if so it prompts the user to save the file to disk (Save As) 

     SaveFileDialog savefile; 
     string trueFileName; 

     if (isStrArrayNotEmpty(inData)) { 
      //Only attempt to save the file if there is anything written in the textArea 

      savefile = new SaveFileDialog(); 

      if (inDataTitle.EndsWith("*")) { 
       //Remove the asterisk from the document name 

       savefile.FileName = inDataTitle.Substring(0, inDataTitle.Length - 1); 
      } 
      else { 
       savefile.FileName = inDataTitle; 
      } 

      savefile.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*"; 

      if (savefile.ShowDialog() == DialogResult.OK) { 
       StreamWriter sw = new StreamWriter(savefile.FileName, false); 
       foreach (string line in inData) { 
        sw.WriteLine(line); 
       } 
       sw.Flush(); 
       if (sw.BaseStream != null) 
        sw.BaseStream.Flush(); 
       sw.Close(); 


       /* 
       using (StreamWriter sw = new StreamWriter(savefile.FileName)) 
        foreach (string line in inData) { 
         sw.WriteLine(line); 
        } 
       */ 

       f.setDocumentName(string.Empty); 
       trueFileName = Path.GetFileName(savefile.FileName); 
       f.setDocumentName(trueFileName); 
       f.setDocumentSavedStatus(true); 
       f.setDocumentChangedStatus(false);  //Changes saved, status updated 
      } 
     } 
    } 

Как вы можете видеть комментарии в коде; Я попытался использовать using, а затем попытался «вручную сбросить» streamwriter, но ничего не работает.

Использование saveAsToFile работает каждый раз. Он перезаписывает текстовый файл, как ожидалось, никаких проблем. Пока saveFile ничего не пишет в файл. (Если оставить без изменений.)

Я пытался найти ошибки в saveFile с помощью MessageBox.Show для печати значений savefile.Filename и line в соответствующих местах - все они работали, как и ожидалось, но ничего не написано фактического текстового файла.

isStrArrayNotEmpty возвращает true, если массив строк не содержит пробелов. getDocumentSavedStatus возвращает значение из boolean, который говорит, если файл был сохранен ранее или нет (существует/не существует) getDocumentChangedStatus возвращает значение из boolean, который говорит, если файл был изменен или нет (звездочка в конце имя файла, указывающее, что работа будет потеряна, если пользователь закрывает приложение.)

+0

Я бы рекомендовал использовать отладчик Visual Studio. И потратить некоторое время на анализ вашего кода. –

ответ

1

Включает ли параметр inDataTitle путь к имени файла, которое вы пытаетесь сохранить? Если нет, это, скорее всего, сохранение файла с тем же именем, но в другой папке.

После вашей линии: -

StreamWriter sw = new StreamWriter(savefile.FileName, false); 

добавьте строку: -

MessageBox.Show(((FileStream)(sw.BaseStream)).Name); 

и скажу вам, где файл сохраняется.

+0

Вы правы. Путь пропал!Я попытаюсь переписать мой код сейчас (сейчас я пытаюсь объединить два метода в один.) Спасибо. знак равно –

0

Попробуйте заменить

StreamWriter sw = new StreamWriter(savefile.FileName, false); 
    foreach (string line in inData) { 
     sw.WriteLine(line); 
    } 
    sw.Flush(); 
    if (sw.BaseStream != null) 
     sw.BaseStream.Flush(); 
    sw.Close(); 

с

File.WriteAllLines(saveFile.Filename, inData); 
+0

Я пробовал, но, к сожалению, это не сработало. Тот же результат, что и раньше. (Использование строки, предложенной вами в методе «saveAsToFile», работает, но не в методе «saveFile».) –

+0

Вы прошли через код в отладчике? Знаете ли вы, что savefile.Filename действительно имеет значение, которое вы ожидаете? –

+0

Я не знаю, как работает bugger. Я использую MessageBox.Show для печати значений переменных при запуске приложения. EDIT: Да, имя файла - это то, что я ожидаю. –