web-dev-qa-db-fra.com

Écrire un fichier texte en mémoire et le sauvegarder avec savefiledialog

J'essaie de créer un fichier texte en mémoire, d'ajouter des lignes et d'enregistrer le fichier dans un fichier texte. Je peux gérer la partie savedialog mais je ne sais pas comment obtenir le fichier texte de la mémoire. Toute aide et conseils seront appréciés.

Ce que je fais jusqu'à présent c'est:

//Initialize in memory text writer
MemoryStream ms = new MemoryStream(); 
TextWriter tw = new StreamWriter(ms);

tw.WriteLine("HELLO WORLD!");
tw.WriteLine("I WANT TO SAVE THIS FILE AS A .TXT FILE!);

notez svp Je vais appeler tw.WriteLine () ajouter plus de lignes à différents endroits pour que je veuille sauvegarder ceci à la fin du programme (afin que cela puisse être placé entre {}).

METTRE À JOUR

StringBuilder semble être une option plus fiable pour le faire! Mon fichier texte présente des découpes étranges lorsque je le fais avec MemoryStream.

Merci. 

13
Saeid Yazdani

Je pense que votre meilleure option ici serait d’écrire dans un StringBuilder, et quand cela sera fait, File.WriteAllText. Si le contenu est large , vous pouvez commencer par écrire directement dans le fichier (via File.CreateText(path)), mais cela devrait suffire pour les fichiers de taille petite à moyenne.

var sb = new StringBuilder();

sb.AppendLine("HELLO WORLD!");
sb.AppendLine("I WANT TO SAVE THIS FILE AS A .TXT FILE!");

File.WriteAllText(path, sb.ToString());
8
Marc Gravell

Supposons que votre nom SaveFileDialog soit "dialogue"

File.WriteAllBytes(dialog.FileName, Encoding.UTF8.GetBytes("Your string"));

ou

var text = "Your string";
text += "some other text";
File.WriteAllText(dialog.FileName, text);

également dans votre propre solution, vous pouvez le faire:

MemoryStream ms = new MemoryStream(); 
TextWriter tw = new StreamWriter(ms);

tw.WriteLine("HELLO WORLD!");
tw.WriteLine("I WANT TO SAVE THIS FILE AS A .TXT FILE!);

// just add this
File.WriteAllBytes(dialog.FileName, ms.GetBuffer());
2
Farzin Zaker

Ou quelque chose de proche de la réponse de @ Marc, mais suffisamment différent pour que je pense que cela vaut la peine d'être présenté comme une solution valable:

using (var writer = new StringWriter())
{
    writer.WriteLine("HELLO WORLD!");
    writer.WriteLine("I WANT TO SAVE THIS FILE AS A .TXT FILE!");
    File.WriteAllLines(path, writer.GetStringBuilder().ToString());
}

path est une chaîne représentant un chemin d'entrée de système de fichiers valide, que vous avez prédéfini quelque part dans l'application.

2
Grant Thomas

Une autre façon d’ajouter du texte à la fin d’un fichier pourrait être:

if (saveFileDialog.ShowDialog() == DialogResult.OK) {
    using (var writer = new StreamWriter(saveFileDialog.Filename, true)) {
        writer.WriteLine(text);
    }
}

en supposant que text est la chaîne que vous devez enregistrer dans votre fichier. Si vous souhaitez ajouter facilement de nouvelles lignes à cette chaîne, procédez comme suit:

var sb = new StringBuilder();
sb.AppendLine("Line 1");
sb.AppendLine("Line 2");

et la chaîne résultante sera sb.ToString()

Si vous avez déjà un objet Stream (dans votre exemple, un MemoryStream), vous pouvez faire de même, mais remplacer la ligne:

using (var writer = new StreamWriter(saveFileDialog.Filename, true)) {

par 

using (var writer = new StreamWriter(memoryStream)) {

Modifier:
À propos de l’emballage des instructions dans using:

Prenez en compte que ce n'est pas un problème du tout. Dans mon premier exemple, tout ce que vous aurez à faire est de conserver cet objet StringBuilder et de lui ajouter des lignes. Une fois que vous avez ce que vous voulez, écrivez simplement les données dans un fichier texte.

Si vous envisagez d'écrire plusieurs fois dans le fichier texte, effacez simplement la variable StringBuilder à chaque écriture pour ne pas obtenir de données dupliquées.

0
Oscar Mederos

Quelque chose comme ça.

Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
dlg.FileName = "Document"; // Default file name
dlg.DefaultExt = ".text"; // Default file extension
dlg.Filter = "Text documents (.txt)|*.txt"; // Filter files by extension

// Show save file dialog box
Nullable<bool> result = dlg.ShowDialog();

// Process save file dialog box results
if (result == true)
{
    // Save document
    using (FileStream file = File.CreateText(dlg.FileName)
    {
        ms.WriteTo(file)
    }
}

Je ne me suis pas inquiété de savoir si le fichier existe déjà, mais cela devrait vous rapprocher.

Vous pourriez aussi avoir besoin d'une ms.Seek(SeekOrgin.Begin, 0).

0
Jodrell