13

メモリ内にテキストファイルを作成し、それにいくつかの行を追加して、最後にファイルをテキストファイルに保存しようとしています。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 {}のようにラップする必要があります)。

アップデート

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

ありがとう。

4

5 に答える 5

8

StringBuilderここでの最善のオプションは、に書き込むことであり、完了したら、に書き込むことだと思いますFile.WriteAllText。内容が大きい場合は、最初に(を介して)ファイルに直接書き込むことを検討できますが、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());
于 2011-04-18T12:35:03.107 に答える
2

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());
于 2011-04-18T12:36:33.410 に答える
2

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

于 2011-04-18T12:43:42.690 に答える
0

このようなもの。

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)ん。

于 2011-04-18T12:41:05.023 に答える
0

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

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データが重複しないように、書き込むたびにクリアしてください。

于 2011-04-18T12:58:28.907 に答える