public static async Task <string> ReadFileAsync(string filePath, int selector = 0) { switch (selector) { /* BOM will be removed. */ case 0: // StreamReader constructor then ReadToEndAsync using (var sr = new StreamReader(filePath)) return(await sr.ReadToEndAsync()); case 1: // StreamReader constructor with encoding then ReadToEndAsync using (var sr = new StreamReader(filePath, Encoding.UTF8)) return(await sr.ReadToEndAsync()); case 2: // StreamReader by File.OpenText then ReadToEndAsync using (var sr = File.OpenText(filePath)) return(await sr.ReadToEndAsync()); case 3: // FileStream constructor and StreamReader constructor then ReadToEndAsync using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) using (var sr = new StreamReader(fs)) return(await sr.ReadToEndAsync()); case 4: // FileStream constructor and StreamReader constructor with Encoding then ReadToEndAsync using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) using (var sr = new StreamReader(fs, Encoding.UTF8)) return(await sr.ReadToEndAsync()); case 5: // FileStream by File.OpenRead and StreamReader constructor then ReadToEnd using (var fs = File.OpenRead(filePath)) using (var sr = new StreamReader(fs)) return(await sr.ReadToEndAsync()); case 6: // FileAddition.ReadAllTextAsync return(await FileAddition.ReadAllTextAsync(filePath)); case 7: // FileAddition.ReadAllTextAsync with encoding return(await FileAddition.ReadAllTextAsync(filePath, Encoding.UTF8)); case 8: // FileAddition.ReadAllTextAsync with encoding and cancellation token using (var cts = new CancellationTokenSource()) { return(await FileAddition.ReadAllTextAsync(filePath, Encoding.UTF8, cts.Token)); } /* BOM will remain as unreadable character. */ case 9: // FileStream constructor then ReadAsync then Encoding.GetString using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { var buff = new byte[fs.Length]; await fs.ReadAsync(buff, 0, buff.Length); return(Encoding.UTF8.GetString(buff)); } default: throw new ArgumentOutOfRangeException(nameof(selector)); } }
public static async Task SaveSelectableBomAsync <T>(string filePath, T source, int selector = 0) { var serializer = new DataContractJsonSerializer(typeof(T)); using (var ms = new MemoryStream()) { serializer.WriteObject(ms, source); var outputString = Encoding.UTF8.GetString(ms.GetBuffer(), 0, (int)ms.Length); var outputBytes = ms.ToArray(); switch (selector) { /* BOM will be emitted. */ case 0: // StreamWriter constructor with encoding using (var sw = new StreamWriter(filePath, false, Encoding.UTF8)) { await sw.WriteAsync(outputString); await sw.FlushAsync(); } break; case 1: // StreamWriter constructor with encoding that encoderShouldEmitUTF8Identifier is true using (var sw = new StreamWriter(filePath, false, new UTF8Encoding(true))) { await sw.WriteAsync(outputString); await sw.FlushAsync(); } break; case 2: // File.WriteAllText with encoding await Task.Run(() => File.WriteAllText(filePath, outputString, Encoding.UTF8)); break; case 3: // FileAddition.WriteAllTextAsync with encoding await FileAddition.WriteAllTextAsync(filePath, outputString, false, Encoding.UTF8); break; case 4: // FileAddition.WriteAllTextAsync with encoding and cancellation token using (var cts = new CancellationTokenSource()) { await FileAddition.WriteAllTextAsync(filePath, outputString, false, Encoding.UTF8, cts.Token); } break; /* No BOM will be emitted. */ case 5: // StreamWriter constructor without encoding using (var sw = new StreamWriter(filePath, false)) { await sw.WriteAsync(outputString); await sw.FlushAsync(); } break; case 6: // StreamWriter constructor with encoding that encoderShouldEmitUTF8Identifier is false using (var sw = new StreamWriter(filePath, false, new UTF8Encoding(false))) { await sw.WriteAsync(outputString); await sw.FlushAsync(); } break; case 7: // StreamWriter constructor by File.CreateText using (var sw = File.CreateText(filePath)) { await sw.WriteAsync(outputString); await sw.FlushAsync(); } break; case 8: // File.WriteAllText without encoding await Task.Run(() => File.WriteAllText(filePath, outputString)); break; case 9: // File.WriteAllBytes await Task.Run(() => File.WriteAllBytes(filePath, outputBytes)); break; case 10: // FileAddition.WriteAllTextAsync without encoding await FileAddition.WriteAllTextAsync(filePath, outputString); break; case 11: // FileAddition.WriteAllTextAsync without encoding but with cancellation token using (var cts = new CancellationTokenSource()) { await FileAddition.WriteAllTextAsync(filePath, outputString, false, cts.Token); } break; default: throw new ArgumentOutOfRangeException(nameof(selector)); } } }