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

时间:2017-04-07 10:28:04

标签: .net vb.net file file-io streamwriter

我想将数据写入文件,因此我使用SaveFileDialog object:

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:如果1,则在0后附加,然后覆盖。我知道我可以为文件创建StreamWriter并为我的目的使用FileMode。但如果我使用SaveFileDialog,则方法OpenFile会返回Stream!我无法创建StreamWriter构造函数(它需要String而不是Stream)。

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

1 个答案:

答案 0 :(得分:1)

您无法使用OpenFile将数据附加到SaveFileDialog中选择的文件中 在关于SaveFileDialog.OpenFile的MSDN文档中,您可以阅读

  

出于安全考虑,此方法使用。创建一个新文件   选择名称并使用读/写权限打开它。这可能会导致   如果选择要保存的现有文件,则会意外丢失数据。   要在保留现有数据的同时将数据保存到现有文件,请使用   File类使用返回的文件名打开文件   FileName属性。

因此,您应该使用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并避免锁定条件

而是使用你可以编写的File类

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