web-dev-qa-db-ja.com

メモリ内のテキストファイルを作成して書き込み、一度にバイト配列に変換する

正しい方法を使用して暗黙的/自動で.csvファイルを作成し、メモリに存在するそのファイルにテキストを追加してから、メモリ内のデータをバイト配列に変換するにはどうすればよいですか?

string path = @"C:\test.txt";
File.WriteAllLines(path, GetLines());
byte[] bytes = System.IO.File.ReadAllBytes(path);

そのアプローチでは、常にファイルを作成し(良い)、書き込み(良い)、次に閉じ(悪い)、ファイルをパスから再度開き、ハードディスクから読み取ります(悪い)

どうすればそれを改善できますか?

更新

ほぼ適切なアプローチの1つは次のとおりです。

  using (var fs = new FileStream(@"C:\test.csv", FileMode.Create, FileAccess.ReadWrite))
            {

                using (var memoryStream = new MemoryStream())
                {

                    fs.CopyTo(memoryStream );
                    return memoryStream .ToArray();
                }

        }

しかし、私はそのファイルストリームにテキストを書き込むことができません...ちょうどバイト...

更新2

 using (var fs = File.Create(@"C:\temp\test.csv"))
            {
                using (var sw = new StreamWriter(fs, Encoding.Default))
                {
                    using (var ms = new MemoryStream())
                    {
                        String message = "Message is the correct ääüö Pi(\u03a0), and Sigma (\u03a3).";
                        sw.Write(message);
                        sw.Flush();
                        fs.CopyTo(ms);
                        return ms.ToArray();
                    }
                }
            }

文字列メッセージはtest.csvファイルに保持されません。誰もが理由を知っていますか?

12
HelloWorld

メモリストリームにテキストを書き込みます。

byte[] bytes = null;
 using (var ms = new MemoryStream())
 {
     TextWriter tw = new StreamWriter(ms);
     tw.Write("blabla");
     tw.Flush();
     ms.Position = 0;
     bytes = ms.ToArray();
     //or save to disk using FileStream (fs)
     ms.WriteTo(fs);
 }

更新

ファイルストリームを直接使用する

 using (var fs = new FileStream(@"C:\sh\test.csv", FileMode.Create, FileAccess.ReadWrite))
 {
     TextWriter tw = new StreamWriter(fs);
     tw.Write("blabla");
     tw.Flush();
 }
15
Xilmiki

エンコードを使用して文字列からバイト配列を取得できます。

Encoding.ASCII.GetBytes(aString);

または

Encoding.UTF8.GetBytes(aString);

しかし、CSVをバイトとして使用する理由がわかりません。ファイル全体を文字列にロードし、追加して保存できます。

string content;

using (var reader = new StreamReader(filename))
{
    content = reader.ReadToEnd();
}

content += "x,y,z";

using (var writer = new StreamWriter(filename))
{
    writer.Write(content);
}

更新:メモリにcsvを作成し、バイトとして返します:

var stringBuilder = new StringBuilder();
foreach(var line in GetLines())
{
    stringBuilder.AppendLine(log);
}
return Encoding.ASCII.GetBytes(stringBuilder.ToString());
8
Steve Harris