如何使用 SaveFileDialog 将数据附加到文件

How to append data to file using SaveFileDialog

我想将数据写入文件,所以我使用SaveFileDialog对象:

Public Class Form3
    Inherits Form
    Public callerForm3To1 As Form1

    Dim fileStream As Stream = Nothing
    Dim fileSW As StreamWriter = Nothing

    Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        SaveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"
        SaveFileDialog1.FilterIndex = 2
        SaveFileDialog1.RestoreDirectory = True

        FlagWriteToFile = False

        If SaveFileDialog1.ShowDialog() = DialogResult.OK Then
            Btn_writeData.Enabled = True
        End If

    End Sub

   'some code
End Class

然后我将数据写入这个打开的文件:

Sub WriteDataToText(data As Long(), appendData As Boolean)
    'Dim a As New StreamWriter(SaveFileDialog1.OpenFile(), FileMode.Append) ' ERROR!
    fileSW = New StreamWriter(SaveFileDialog1.OpenFile())
    If (fileSW IsNot Nothing) Then

        fileSW.WriteLine(String.Join(" ", data) + Environment.NewLine)
        fileSW.Close()
    End If
End Sub

我想要的是:有时我需要向这个文件追加数据,有时需要覆盖。我为此创建了 appendData:if 1 then append if 0 then overwrite。我知道我可以为文件创建 StreamWriter 并为我的目的使用 FileMode。但是如果我使用 SaveFileDialog 它是方法 OpenFile returns Stream!而且我无法创建 StreamWriter 构造函数(它需要字符串而不是流)。

如何使用 SaveFileDialog 将数据附加到文件?

您不能使用 OpenFile 将数据附加到在 SaveFileDialog 中选择的文件。
在有关 SaveFileDialog.OpenFile 的 MSDN 文档中,您可以阅读

For security purposes, this method creates a new file with the selected name and opens it with read/write permissions. This can cause unintentional loss of data if you select an existing file to save to. To save data to an existing file while retaining existing data, use the File class to open the file using the file name returned in the FileName property.

因此您应该使用 FileName 属性 和 StreamWriter 构造函数编写代码,该构造函数接受布尔值 True 以附加数据或 false 以覆盖文件。

Sub WriteDataToText(data As Long(), appendData As Boolean)
    Using fileSW = New StreamWriter(SaveFileDialog1.FileName, appendData)
        fileSW.WriteLine(String.Join(" ", data) + Environment.NewLine)
    End Using
End Sub

记住始终在这些一次性对象周围使用 Using 语句,以确保正确关闭和处理 Stream 并避免锁定条件

而不是使用文件 class 你可以写

 Dim newLine = String.Join(" ", data) + Environment.NewLine)
 If appendData Then
     File.AppendAllText(SaveFileDialog1.FileName, newLine)
 else
     File.WriteAllText(SaveFileDialog1.FileName, newLine)
 End If