28

如何使用正确的方法隐式/自动创建 .csv 文件,将文本添加到内存中存在的该文件,然后将内存中的数据转换为字节数组?

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

使用这种方法,我总是创建一个文件(好),写入它(好)然后关闭它(坏)然后从路径再次打开文件并从硬盘读取它(坏)

我该如何改进呢?

更新

一种几乎很好的方法是:

  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 文件中。有谁知道为什么?

4

2 回答 2

33

将文本写入内存流。

byte[] bytes = null;
using (var ms = new MemoryStream())
{
    using(TextWriter tw = new StreamWriter(ms)){
       tw.Write("blabla");
       tw.Flush();
       ms.Position = 0;
       bytes = ms.ToArray();
    }
  
}

更新

直接使用文件流并写入文件

using (var fs = new FileStream(@"C:\ed\test.csv", FileMode.Create, FileAccess.ReadWrite))
{
    using (TextWriter tw = new StreamWriter(fs))
    {
        tw.Write("blabla");
        tw.Flush();
    }
}
于 2016-04-16T07:20:11.660 回答
17

您可以使用编码从字符串中获取字节数组:

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(line);
}
return Encoding.ASCII.GetBytes(stringBuilder.ToString());
于 2016-04-16T08:05:32.907 回答