2016-04-16 5 views
5

Wie kann ich eine .csv-Datei implizit/automatisch erstellen, indem Sie die richtige Methode verwenden, Text zu dieser Datei im Speicher hinzufügen und dann in Arbeitsspeicher konvertieren Daten zu einem Byte-Array?Erstellen und Schreiben in eine Textdatei inmemory und Konvertieren in Byte-Array auf einmal

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

Mit diesem Ansatz, den ich immer eine Datei erstellen (gut), schreibt in sie (gut), dann schließen Sie es (sehr schlecht) und öffnen Sie dann die Datei erneut von einem Pfad und lesen Sie es von der Festplatte (sehr schlecht)

Wie kann ich das verbessern?

UPDATE

Ein fast guter Ansatz wäre:

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

       using (var memoryStream = new MemoryStream()) 
       { 

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

     } 

aber ich bin nicht in der Lage Text in das Filestream zu schreiben ... nur Bytes ...

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

Die String-Nachricht wird nicht in der Datei test.csv beibehalten. Wer weiß warum?

Antwort

5

Schreiben Sie Text in den Speicher-Stream.

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

Verwenden Datei-Stream direkt

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

wie geben Sie den Textwriter zum FileStream? Erstellen Sie einen FileStream, den Sie nicht weitergeben können. – HelloWorld

+0

TextWriter akzeptiert einen Stream als Eingabe, so dass Sie FileStream direkt darauf verwenden können. – Xilmiki

+0

Ich glaube, Sie haben meine ursprüngliche Frage falsch verstanden. Ich möchte nicht nur eine Textdatei erstellen ... bitte beachten Sie auch das Byte [] mit den gewünschten "Text" -Daten. – HelloWorld

5

Sie können ein Byte-Array aus einem String mit Codierung erhalten:

Encoding.ASCII.GetBytes(aString); 

Oder

Encoding.UTF8.GetBytes(aString); 

Aber ich weiß nicht, warum Sie eine csv als Bytes wollen. Sie könnten die gesamte Datei in einen String zu laden, um es hinzuzufügen, und speichern Sie es dann:

string content; 

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

content += "x,y,z"; 

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

Update: csv im Speicher erstellen und als Bytes überschreiten zurück:

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

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

Ich möchte eine .csv-Datei als Bytes aus einer HttpGet-Anfrage als eine Datei für den Benutzer zurückgeben. – HelloWorld

+0

Möchten Sie tatsächlich, dass eine CSV-Datei auf dem Datenträger erstellt wird, oder nur die Bytes, die zurückgegeben werden sollen? –

+0

Return-Byte [] ist genug - wenn das möglich ist - – HelloWorld

Verwandte Themen