web-dev-qa-db-ja.com

メモリにテキストファイルを書き込み、savefiledialogで保存する

メモリ内にテキストファイルを作成し、それにいくつかの行を追加して、最後にファイルをテキストファイルに保存しようとしています。 savedialogの部分を処理できますが、メモリからテキストファイルを取得する方法がわかりません。ヘルプとヒントがあれば適用されます。

私がこれまでやっているのは:

//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!);

注意してください tw.WriteLine()を呼び出して、さまざまな場所に行を追加します。これをプログラムの最後に保存します(したがって、これは、using {}のようにラップする必要があります)。

[〜#〜] update [〜#〜]

StringBuilderは、これを行うためのより信頼性の高いオプションのようです。 MemoryStreamを使用してテキストファイルを作成すると、奇妙な切り抜きが表示されます。

ありがとう。

13
Saeid Yazdani

ここでの最善の選択肢は、StringBuilderに書き込むことであり、完了したら_File.WriteAllText_に書き込むことだと思います。内容がlargeの場合、最初に(File.CreateText(path)を介して)ファイルに直接書き込むことを検討できますが、中小規模のファイルの場合は問題ありません。

_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

SaveFileDialogの名前が「ダイアログ」であると仮定します

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

または

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

また、独自のソリューションでこれを行うことができます:

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

または、@ Marcの回答とほぼ同じですが、有効な解決策としてそこに出す価値があると思うほど異なるものです。

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は、アプリケーションのどこかで事前定義された、有効なファイルシステムエントリパスを表す文字列です。

2
Grant Thomas

ファイルの末尾にテキストを追加する別の方法は次のとおりです。

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

textがファイルに保存する必要のある文字列であると仮定します。その文字列に簡単な方法で新しい行を追加したい場合は、次のことができます。

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

結果の文字列はsb.ToString()になります

すでにStreamオブジェクト(この例ではMemoryStream)がある場合は、同じことを実行できますが、次の行を置き換えます。

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

沿って

_using (var writer = new StreamWriter(memoryStream)) {
_

編集:
ステートメントをusing内にラップすることについて:

これはまったく問題ではないことを考慮に入れてください。私の最初の例では、あなたがしなければならないのは、そのStringBuilderオブジェクトを保持し、それに行を追加し続けることだけです。必要なものが揃ったら、データをテキストファイルに書き込むだけです。

テキストファイルに複数回書き込む場合は、データが重複しないように、書き込むたびにStringBuilderをクリアしてください。

0
Oscar Mederos

このようなもの。

_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)
    }
}
_

私はファイルがすでに存在するかどうかについて心配していませんが、これはあなたを近づけるはずです。

ms.Seek(SeekOrgin.Begin, 0)も必要になる場合があります。

0
Jodrell