2016-04-16 7 views
5

Как создать файл .csv неявно/автоматически с помощью правильного метода, добавить текст в этот файл, существующий в памяти, а затем преобразовать в память данные в массив байтов?Создание и запись в текстовый файл inmemory и преобразование в массив байтов за один раз

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

     } 

, но я не в состоянии написать текст в этом FileStream ... только байты ...

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

Update: Создание 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