using System; using System.Globalization; using System.IO; namespace PCL.Core.IO; public class ByteStream(Stream stream) { private static readonly string[] _Units = ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"]; public long Length => stream.Length; public string GetReadableLength() { return GetReadableLength(Length); } /// /// 格式化大小 /// /// 字节 /// 开始单位 /// 格式化区域提供程序,默认使用 /// /// public static string GetReadableLength(long length, int startUnit = 0, IFormatProvider? provider = null) { ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(startUnit, _Units.Length); ArgumentOutOfRangeException.ThrowIfLessThan(startUnit, 0); var isNegative = length < 0; decimal absBytes = isNegative ? -length : length; if (absBytes == 0) return "0 B"; var unitIndex = startUnit; var value = absBytes; while (value >= 1024 && unitIndex < _Units.Length - 1) { value /= 1024; unitIndex++; } if (unitIndex >= _Units.Length) throw new ArgumentOutOfRangeException(nameof(length), "Value too large for predefined units."); var sign = isNegative ? "-" : ""; return $"{sign}{value.ToString("0.##", provider ?? CultureInfo.InvariantCulture)} {_Units[unitIndex]}"; } }