2016-04-16 4 views
5

正しい方法を使用して.csvファイルを暗黙的に/自動的に作成し、メモリに存在するファイルにテキストを追加してメモリに変換するにはバイト配列へのデータ?私は常にファイル(良い)を作成し、そのアプローチで テキストファイルを作成してメモリに書き込んで、一度にバイト配列に変換する

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

、その後、(悪い)それを閉じて(良い)に書き込み、その後のパスからファイルを再度開いて、ハードディスクからそれを読んで(悪い)

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

UPDATE

一つのほぼ良いアプローチは次のようになります。

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

       using (var memoryStream = new MemoryStream()) 
       { 

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

     } 

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

UPDATE 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ファイルに永続化されません。なぜ誰も知っていますか?

答えて

5

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

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

UPDATE

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

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

どのようにあなたがしたTextWriterを渡すんFileStreamに? FileStreamを作成すると、それを渡すことはできません。 – HelloWorld

+0

TextWriterはストリームを入力として受け入れますので、FileStreamを直接使用できます。 – Xilmiki

+0

私は元の質問を誤解していると思います。私はテキストファイルを作成したいだけではありません...私が望む "テキスト"データでバイト[]も考慮してください。 – HelloWorld

5

あなたはエンコーディングを使って文字列からバイト配列を取得することができます。

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ファイルを作成し、バイトとしてバックパス:

using (var sb = new StringBuilder()) 
{ 
    foreach (string line in GetLines()) 
     sb.AppendLine(line); 

    return Encoding.ASCII.GetBytes(sb.ToString()); 
} 
+0

.csvファイルを、ユーザーのファイルとしてHttpGet要求から返すバイトとして欲しいです。 – HelloWorld

+0

実際にcsvファイルをディスクに作成したいのですか? –

+0

バイトを返すだけで十分です - 可能ならば – HelloWorld

関連する問題