예제 #1
0
        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));
            }
        }
예제 #2
0
        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));
                }
            }
        }