2016-04-16 15 views
5

Come posso creare un file .csv in modo implicito/automatico utilizzando il metodo corretto, aggiungere del testo a quel file esistente in memoria e quindi convertirlo in memoria dati in un array di byte?Creare e scrivere su un file di testo in memoria e convertirlo in array di byte in una volta

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

Con tale approccio crea un file di sempre (bene), scrivere in esso (buono) quindi chiuderlo (cattivo) quindi aprire il file di nuovo da un percorso e leggerlo dal disco rigido (cattivo)

Come posso migliorarlo?

UPDATE

uno quasi buon approccio sarebbe:

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

       using (var memoryStream = new MemoryStream()) 
       { 

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

     } 

ma io non sono in grado di scrivere il testo in quella filestream ... solo byte ...

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

Il messaggio di stringa non viene mantenuto nel file test.csv. Qualcuno sa perché?

risposta

5

Scrive il testo in Memory 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

flusso Utilizza file direttamente

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

come si fa a passare il TextWriter nel FileStream? Creare un FileStream non puoi passarlo. – HelloWorld

+0

TextWriter accetta uno stream come input in modo da poter utilizzare direttamente FileStream. – Xilmiki

+0

Penso che tu abbia frainteso la mia domanda iniziale. Non voglio solo creare un file di testo ... per favore considera anche il byte [] con i dati di "testo" che voglio. – HelloWorld

5

È possibile ottenere un array di byte da una stringa utilizzando la codifica:

Encoding.ASCII.GetBytes(aString); 

O

Encoding.UTF8.GetBytes(aString); 

Ma non so perché vorreste un csv come byte. Si potrebbe caricare l'intero file in una stringa, aggiungere ad esso e quindi salvarlo:

string content; 

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

content += "x,y,z"; 

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

Aggiornamento: Creare un csv nella memoria e passare di nuovo come byte:

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

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

Voglio un file .csv come byte che li restituisce da una richiesta HttpGet come file per l'utente. – HelloWorld

+0

Vuoi davvero creare un file csv su disco, o solo i byte da restituire? –

+0

Il byte di ritorno [] è sufficiente - se possibile - – HelloWorld

Problemi correlati