2017-04-07 1 views
1

Je veux écrire des données dans un fichier, donc j'utiliser l'objet SaveFileDialog:Comment ajouter des données à fichier à l'aide 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 

Et après que j'écrire des données dans ce fichier ouvert:

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 

Ce que je veux: parfois j'ai besoin d'ajouter des données à ce fichier, et parfois écraser. Je crée appendData pour cela: si 1 puis ajouter si 0 puis remplacer. Je sais que je peux créer StreamWriter pour le fichier et utiliser FileMode pour mes fins. Mais si j'utilise SaveFileDialog c'est la méthode OpenFile renvoie Stream! Et je ne peux pas créer StreamWriter Constructor (il faut String non Stream).

Comment ajouter des données à un fichier en utilisant SaveFileDialog?

+1

Convertir le flux en une chaîne en utilisant StreamReader.ReadToEnd – Benno

+0

@Benno pouvez-vous me montrer un exemple plus détaillé? J'ai essayé celui-ci: 'sr Dim comme nouveau StreamReader (SaveFileDialog1.OpenFile) fileSW = Nouveau StreamWriter (sr.ReadToEnd, FileMode.Append)' mais a obtenu l'erreur: nom de chemin vide n'est pas légal. –

Répondre

1

Vous ne pouvez pas utiliser OpenFile pour ajouter des données au fichier sélectionné dans SaveFileDialog.
Dans la documentation MSDN à propos SaveFileDialog.OpenFile vous pouvez lire

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.

Alors vous devez écrire votre code en utilisant la propriété FileName avec le constructeur StreamWriter qui accepte un booléen vrai pour ajouter des données ou faux pour remplacer le fichier.

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 

Souvenez-vous de toujours utiliser l'instruction Using autour de ces objets à usage unique pour être sûr de fermeture correcte et l'élimination des cours d'eau et d'éviter des conditions de verrouillage

Au lieu d'utiliser la classe de fichier que vous pouvez écrire

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

Si je comprends bien, en utilisant File Class (au lieu de SaveFileDialog) est plus de sécurité? –

+0

SaveFileDialog a un but différent. La classe StreamWriter est utilisée en interne par File.WriteAllText et File.AppendAllText. Ces deux méthodes sont des raccourcis pratiques mais rien à voir avec la sécurité – Steve

+0

Merci de votre aide! –