Encoding GetOutputEncoding(EncodingInformation sourceEncodingInformation) { var outputEncoding = OutputEncoding; if (null != outputEncoding) { return(outputEncoding); } switch (OutputBomPolicy) { case BomPolicy.Never: return(Utf8WithoutBom); case BomPolicy.CopySource: return(sourceEncodingInformation.BomDetected ? Utf8WithBom : Utf8WithoutBom); case BomPolicy.CopyUtf8OrForce: if (sourceEncodingInformation.Encoding.CodePage == Encoding.UTF8.CodePage && !sourceEncodingInformation.BomDetected) { return(Utf8WithoutBom); } break; case BomPolicy.Force: default: break; } return(Utf8WithBom); }
Encoding GetOutputEncoding(EncodingInformation sourceEncodingInformation) { var outputEncoding = OutputEncoding; if (null != outputEncoding) return outputEncoding; switch (OutputBomPolicy) { case BomPolicy.Never: return Utf8WithoutBom; case BomPolicy.CopySource: return sourceEncodingInformation.BomDetected ? Utf8WithBom : Utf8WithoutBom; case BomPolicy.CopyUtf8OrForce: if (sourceEncodingInformation.Encoding.CodePage == Encoding.UTF8.CodePage && !sourceEncodingInformation.BomDetected) return Utf8WithoutBom; break; case BomPolicy.Force: default: break; } return Utf8WithBom; }
public async Task <bool> TransformFileAsync(Stream inputStream, Stream outputStream) { var encoding = await EncodingInformation.DetectEncodingAsync(inputStream).ConfigureAwait(false); if (null == encoding) { throw new Exception("Unknown encoding"); } inputStream.Seek(0, SeekOrigin.Begin); using (var inputHash = SHA256.Create()) { using (var outputHash = SHA256.Create()) { using (var inputFilter = new CryptoStream(inputStream, inputHash, CryptoStreamMode.Read)) { using (var outputFilter = new CryptoStream(outputStream, outputHash, CryptoStreamMode.Write)) { using (var tr = new StreamReader(inputFilter, encoding.Encoding)) { var outputEncoding = GetOutputEncoding(encoding); using (var sw = new StreamWriter(outputFilter, outputEncoding, 4096, true)) { await TransformCoreAsync(tr, sw).ConfigureAwait(false); } } } } // Only return "true" if the files are the same (at least, they have the same SHA-256). return(!inputHash.Hash.SequenceEqual(outputHash.Hash)); } } }