ファイルを非同期的に書き込むためのこのコード スニペットがあります。
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);
};
}
を設定したにもかかわらず、作成されたテキスト ファイルは ANSI 形式のままですEncoding.UTF8
。クラスには 15 個のオーバーロードされたコンストラクターがありFileStream
、エンコードされたテキストでない場合、これをどこに設定する必要があるかはまったくわかりません。
ファイルが ANSI であることがわかります。TextPad でファイルを開いてファイル統計を表示すると、ANSI がコード セットとしてリストされているからです。
MySQLLOAD 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 として認識しましたが、MySQLLOAD INFILE
はまだ失敗しました。Textpad で再保存すると、MySQL はそれを正しく認識しました。
コードを次のように変更しました。
using (TextWriter writer = File.CreateText(filePath))
{
await writer.WriteAsync(text);
}
これは両方で機能するようでした。これに関してMySQLの問題が何であるかはわかりませんLOAD INFILE
。