C# 覆盖文本文件 - 没有任何内容写入文件

C# Overwrite text file - nothing is written to file

我有两种方法:saveFilesaveAsToFile。第一个应该覆盖当前现有文件的内容。而第二个应该保存为一个新文件(如果当前文件不存在或者用户只想制作一个副本。)

当我使用 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,然后尝试 "manually flush" streamwriter,但没有任何效果。

每次都使用 saveAsToFile。它按预期覆盖文本文件,没有问题。虽然 saveFile 不会向文件写入任何内容。 (保持不变。)

我尝试通过使用 MessageBox.Show 在适当的位置打印 savefile.Filenameline 的值来查找 saveFile 中的错误 - 它们都按预期工作,但是没有任何内容写入实际的文本文件。

isStrArrayNotEmpty returns 如果字符串数组不包含任何空格,则为真。 getDocumentSavedStatus returns 的值 boolean 表示文件之前是否保存过(存在/不存在) getDocumentChangedStatus returns 一个 boolean 的值,它告诉文件是否被修改(文件名末尾有星号,表示如果用户关闭,工作将会丢失应用程序。)

尝试替换

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

inDataTitle 参数是否包含您要保存的文件名的路径?如果不是,它可能保存到同名文件但在不同的文件夹中。

在你的行之后:-

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

添加行:-

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

它会告诉您文件的保存位置。