Полностью переписать текстовый файл с StreamWriter - PullRequest
1 голос
/ 29 апреля 2019

Я пытаюсь добавить в свою программу простой переключатель, который, помимо прочего, записывает в файл.Файл не содержит ничего, кроме одной строки текста, которую я хочу прочитать «включено» или «выключено».

Private Sub PictureBox2_Click(sender As Object, e As EventArgs) Handles PictureBox2.Click

    Dim fStrm As FileStream = File.Open(muteFile, FileMode.OpenOrCreate)
    Dim strmWrtr As StreamWriter = New StreamWriter(fStrm)
    strmWrtr.Flush()

    If PictureBox2.Tag = "On" Then
        PictureBox2.Image = My.Resources.SoundOff
        PictureBox2.Tag = "Off"
        strmWrtr.Write("off", False)
    Else
        PictureBox2.Image = My.Resources.SoundOn
        PictureBox2.Tag = "On"
        strmWrtr.Write("on", False)
    End If

    strmWrtr.Close()
    fStrm.Close()

End Sub

Все работает, но ведет себя не так, как я ожидал.Запись «off» в файл работает нормально, но когда я использую strmWrtr.Write("on," False), файл содержит «onf», как если бы он просто перезаписывал символ за символом и оставлял то, что не перезаписывал.Кроме того, если я изменю его с «on» и «off» на «123456789» и «off», у меня останется «off456789».

Мне хотелось бы перезаписать файл полностью.

Единственное решение, о котором я подумал, - это всегда удалять и воссоздавать файл, но я надеялся, что для этого есть более чистый способ.возможно я просто что-то упустил.

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Я бы предложил использовать StreamWriter с добавленным значением False. Это будет перезаписывать файл каждый раз. Кроме того, я пишу только в файл внутри блока using. Я не выполняю другие операции, пока файл открыт.

Private Sub PictureBox2_Click(sender As Object, e As EventArgs) Handles PictureBox2.Click
    If PictureBox2.Tag = "On" Then
        PictureBox2.Image = My.Resources.SoundOff
        PictureBox2.Tag = "Off"
    Else
        PictureBox2.Image = My.Resources.SoundOn
        PictureBox2.Tag = "On"
    End If

    Using strmWrtr = New StreamWriter(muteFile, False)
        strmWrtr.Write(PictureBox2.Tag, False)
    End Using
End Sub
1 голос
/ 29 апреля 2019

Вы специально используете FileMode.OpenOrCreate, что означает «повторное использование, если существует».
Если вы хотите перезаписывать файл каждый раз, используйте FileMode.Create.

Еще лучше, не беспокойтесь о явных потоках (вы все равно не используете Using, как вы должны в любом случае), и просто выполните <a href="https://docs.microsoft.com/en-us/dotnet/api/system.io.file.writealltext?view=netframework-4.8" rel="nofollow noreferrer">File.WriteAllText</a>(muteFile, "on").

...