public static IEnumerable ReadSizedBlocks(SqlFileInfo fileInfo, SqlInt64 offset, SqlByte sizing, [DefaultValue("NULL")] SqlInt32 maxCount) { if (fileInfo.IsNull || sizing.IsNull) { yield break; } var sizeEncoding = (SizeEncoding)sizing.Value; if (sizeEncoding == SizeEncoding.NO) { yield break; } using (var fs = fileInfo.FileInfo.OpenRead()) { if (!offset.IsNull) { fs.Position = offset.Value; } var position = fs.Position; foreach (var block in fs.ReadCollection(s => s.TryReadBytes(sizeEncoding), maxCount.IsNull ? int.MaxValue : maxCount.Value)) { yield return(Tuple.Create(position, block)); position = fs.Position; } } }
public static IEnumerable ReadLinesByCpName(SqlFileInfo fileInfo, SqlInt64 offset, SqlString searchTerminator, SqlString delimiter, [DefaultValue("''")] SqlString newTerminator, [DefaultValue("NULL")] SqlInt32 maxCount, SqlBoolean detectEncoding, [SqlFacet(MaxSize = 128)] SqlString cpName) { if (fileInfo.IsNull || searchTerminator.IsNull) { yield break; } var fileEncoding = cpName.IsNull ? SqlRuntime.FileEncoding : Encoding.GetEncoding(cpName.Value); var terminatorsList = searchTerminator.IsNull || delimiter.Value.Length == 0 ? new[] { searchTerminator.Value } : searchTerminator.Value.Split(new[] { delimiter.Value }, StringSplitOptions.RemoveEmptyEntries); using (var fs = fileInfo.FileInfo.OpenRead()) { if (detectEncoding.IsTrue) { var preamble = EncodingPreamble.Detect(fs.ReadAt(0L, s => s.ReadBytesMost(1, 4)) ?? new byte[0]); if (preamble != null) { fileEncoding = Encoding.GetEncoding(preamble.CodePage); } } if (!offset.IsNull) { fs.Position = offset.Value; } var position = fs.Position; foreach (var line in fs.ReadLines(fileEncoding, terminatorsList, newTerminator.IsNull ? null : newTerminator.Value, maxCount.IsNull ? int.MaxValue : maxCount.Value)) { yield return(Tuple.Create(position, line)); position = fs.Position; } } }
public static IEnumerable ReadTerminatedBlocks(SqlFileInfo fileInfo, SqlInt64 offset, SqlBytes searchTerminator, [DefaultValue("1")] SqlBoolean omitTerminator, [DefaultValue("NULL")] SqlInt32 maxCount) { if (fileInfo.IsNull || searchTerminator.IsNull) { yield break; } var terminator = searchTerminator.Value; using (var fs = fileInfo.FileInfo.OpenRead()) { if (!offset.IsNull) { fs.Position = offset.Value; } var position = fs.Position; foreach (var block in fs.ReadCollection(s => s.TryReadBytes(terminator, omitTerminator.IsTrue), maxCount.IsNull ? int.MaxValue : maxCount.Value)) { yield return(Tuple.Create(position, block)); position = fs.Position; } } }