diff --git a/binding/csharp/IP2Region.Net/IP2Region.Net.csproj b/binding/csharp/IP2Region.Net/IP2Region.Net.csproj index dc0e1ab..83901fe 100644 --- a/binding/csharp/IP2Region.Net/IP2Region.Net.csproj +++ b/binding/csharp/IP2Region.Net/IP2Region.Net.csproj @@ -2,7 +2,7 @@ IP2Region.Net - 3.0.0 + 2.1.1 IP2Region.Net Alan Lee Apache-2.0 diff --git a/binding/csharp/IP2Region.Net/Internal/Abstractions/AbstractCacheStrategy.cs b/binding/csharp/IP2Region.Net/Internal/Abstractions/AbstractCacheStrategy.cs index d94524b..909f75c 100644 --- a/binding/csharp/IP2Region.Net/Internal/Abstractions/AbstractCacheStrategy.cs +++ b/binding/csharp/IP2Region.Net/Internal/Abstractions/AbstractCacheStrategy.cs @@ -15,10 +15,11 @@ internal abstract class AbstractCacheStrategy(string xdbPath) protected const int VectorIndexSize = 8; private const int BufferSize = 64 * 1024; - private readonly FileStream _xdbFileStream = new(xdbPath, FileMode.Open, FileAccess.Read, FileShare.Read, BufferSize, FileOptions.RandomAccess); public int IoCount { get; private set; } + protected FileStream XdbFileStream = new(xdbPath, FileMode.Open, FileAccess.Read, FileShare.Read, BufferSize, FileOptions.RandomAccess); + public void ResetIoCount() { IoCount = 0; @@ -26,24 +27,18 @@ internal abstract class AbstractCacheStrategy(string xdbPath) public virtual ReadOnlyMemory GetVectorIndex(int offset) => GetData(HeaderInfoLength + offset, VectorIndexSize); - public virtual ReadOnlyMemory GetData(int offset = 0, int length = 0) + public virtual ReadOnlyMemory GetData(long offset, int length) { - if (length == 0) - { - length = (int)_xdbFileStream.Length; - } - byte[] buffer = ArrayPool.Shared.Rent(length); int totalBytesRead = 0; try { - _xdbFileStream.Seek(offset, SeekOrigin.Begin); + XdbFileStream.Seek(offset, SeekOrigin.Begin); int bytesRead; while (totalBytesRead < length) { - int bytesToRead = Math.Min(BufferSize, length - totalBytesRead); - bytesRead = _xdbFileStream.Read(buffer, totalBytesRead, bytesToRead); + bytesRead = XdbFileStream.Read(buffer, totalBytesRead, length); totalBytesRead += bytesRead; IoCount++; diff --git a/binding/csharp/IP2Region.Net/Internal/ContentCacheStrategy.cs b/binding/csharp/IP2Region.Net/Internal/ContentCacheStrategy.cs index cc88359..135751d 100644 --- a/binding/csharp/IP2Region.Net/Internal/ContentCacheStrategy.cs +++ b/binding/csharp/IP2Region.Net/Internal/ContentCacheStrategy.cs @@ -15,8 +15,10 @@ class ContentCacheStrategy : AbstractCacheStrategy public ContentCacheStrategy(string xdbPath) : base(xdbPath) { - _cacheData = base.GetData(); + _cacheData = base.GetData(0, (int)XdbFileStream.Length); + XdbFileStream.Close(); + XdbFileStream.Dispose(); } - public override ReadOnlyMemory GetData(int offset = 0, int length = 0) => _cacheData.Slice(offset, length); + public override ReadOnlyMemory GetData(long offset = 0, int length = 0) => _cacheData.Slice((int)offset, length); } diff --git a/binding/csharp/IP2Region.Net/Internal/VectorIndexCacheStrategy.cs b/binding/csharp/IP2Region.Net/Internal/VectorIndexCacheStrategy.cs index 8ea0b01..b5abc17 100644 --- a/binding/csharp/IP2Region.Net/Internal/VectorIndexCacheStrategy.cs +++ b/binding/csharp/IP2Region.Net/Internal/VectorIndexCacheStrategy.cs @@ -18,7 +18,10 @@ class VectorIndexCacheStrategy : AbstractCacheStrategy public VectorIndexCacheStrategy(string xdbPath) : base(xdbPath) { - _vectorCache = GetData(HeaderInfoLength, VectorIndexRows * VectorIndexCols * VectorIndexSize); + XdbFileStream.Seek(HeaderInfoLength, SeekOrigin.Begin); + var buffer = new byte[VectorIndexRows * VectorIndexCols * VectorIndexSize]; + var length = XdbFileStream.Read(buffer, 0, buffer.Length); + _vectorCache = new ReadOnlyMemory(buffer); } public override ReadOnlyMemory GetVectorIndex(int offset) => _vectorCache.Slice(offset, VectorIndexSize);