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.
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());
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());
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());
}
Où 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.
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.
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)
.