我有这样一段代码可以异步写入文件:
private static async Task WriteTextAsync(string filePath, string text)
{ //Writes to our output files
byte[] encodedText = Encoding.UTF8.GetBytes(text);
using (FileStream sourceStream = new FileStream(filePath,
FileMode.Create, FileAccess.Write, FileShare.None,
bufferSize: 4096, useAsync: true))
{
await sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
};
}
尽管设置了
Encoding.UTF8
,但创建的文本文件仍然是ANSI格式。 FileStream
类有15个重载构造函数,如果不是在编码后的文本上设置,我完全不清楚在哪里应该设置它。
我可以判断该文件是ANSI格式,因为当我在TextPad中打开它并查看文件统计信息时,它将ANSI列为代码集:
遇到了问题,因为MySQL的LOAD INFILE
无法正确读取该文件,在阅读答案后,我认为这与BOM有关,但不确定。
我尝试了以下内容(用于BOM):
byte[] encodedText = new byte[] { 0xEF, 0xBB, 0xBF }.Concat(Encoding.UTF8.GetBytes(text)).ToArray();
using (FileStream sourceStream = new FileStream(filePath,
FileMode.Create, FileAccess.Write, FileShare.None,
bufferSize: 4096, useAsync: true))
{
await sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
};
在Textpad中打开后,发现文件是UTF8编码,但使用MySQL的LOAD INFILE
仍然失败。将文件重新保存在Textpad中后,MySQL便能够正常读取。
代码已更改为:
using (TextWriter writer = File.CreateText(filePath))
{
await writer.WriteAsync(text);
}
这似乎在两个方面都有效。关于MySQL的LOAD INFILE
问题,我不确定是什么原因。