From 4e60cd8649c3c19582ae560515cad00436587a2e Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期五, 13 三月 2026 13:36:35 +0800
Subject: [PATCH] fix: improve MemoryStore code quality and error handling
---
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryStore.cs | 264 +++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 199 insertions(+), 65 deletions(-)
diff --git a/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryStore.cs b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryStore.cs
index a1b992e..9583b42 100644
--- a/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryStore.cs
+++ b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryStore.cs
@@ -72,13 +72,21 @@
/// <summary>
/// 璇诲彇瀛楄妭鏁版嵁
/// </summary>
+ /// <param name="address">鍦板潃锛堝 "M100", "DB1.DBD0", "I0.0", "T1"锛�</param>
+ /// <param name="length">闀垮害锛堝繀椤诲ぇ浜�0锛�</param>
+ /// <returns>瀛楄妭鏁扮粍</returns>
+ /// <exception cref="ArgumentException">鍦板潃涓虹┖鎴栫┖鐧斤紝鎴栭暱搴︿负0</exception>
+ /// <exception cref="ObjectDisposedException">瀵硅薄宸查噴鏀�</exception>
public byte[] ReadBytes(string address, ushort length)
{
if (_disposed)
throw new ObjectDisposedException(nameof(MemoryStore));
- if (string.IsNullOrEmpty(address))
- throw new ArgumentException("鍦板潃涓嶈兘涓虹┖", nameof(address));
+ if (string.IsNullOrWhiteSpace(address))
+ throw new ArgumentException("鍦板潃涓嶈兘涓虹┖鎴栫┖鐧�", nameof(address));
+
+ if (length == 0)
+ throw new ArgumentException("闀垮害蹇呴』澶т簬0", nameof(length));
var (regionType, offset, dbNumber, bitOffset) = ParseAddress(address);
@@ -96,14 +104,21 @@
/// <summary>
/// 璇诲彇鎸囧畾绫诲瀷鏁版嵁
+ /// 鏀寔鐨勭被鍨嬶細bool, short, int, ushort, float
+ /// 娉ㄦ剰锛歴tring绫诲瀷涓嶅彈鏀寔锛岃浣跨敤WriteBytes/ReadBytes鎴栭�氳繃DBRegion鐩存帴璁块棶
/// </summary>
+ /// <typeparam name="T">鍊肩被鍨嬶紙bool, short, int, ushort, float锛�</typeparam>
+ /// <param name="address">鍦板潃</param>
+ /// <returns>鏁版嵁鍊�</returns>
+ /// <exception cref="ArgumentException">鍦板潃涓虹┖鎴栫┖鐧斤紝鎴栫被鍨嬩笉鏀寔</exception>
+ /// <exception cref="ObjectDisposedException">瀵硅薄宸查噴鏀�</exception>
public T Read<T>(string address) where T : struct
{
if (_disposed)
throw new ObjectDisposedException(nameof(MemoryStore));
- if (string.IsNullOrEmpty(address))
- throw new ArgumentException("鍦板潃涓嶈兘涓虹┖", nameof(address));
+ if (string.IsNullOrWhiteSpace(address))
+ throw new ArgumentException("鍦板潃涓嶈兘涓虹┖鎴栫┖鐧�", nameof(address));
var (regionType, offset, dbNumber, bitOffset) = ParseAddress(address);
@@ -122,13 +137,18 @@
/// <summary>
/// 鍐欏叆瀛楄妭鏁版嵁
/// </summary>
+ /// <param name="address">鍦板潃</param>
+ /// <param name="data">鏁版嵁</param>
+ /// <exception cref="ArgumentException">鍦板潃涓虹┖鎴栫┖鐧�</exception>
+ /// <exception cref="ArgumentNullException">鏁版嵁涓簄ull</exception>
+ /// <exception cref="ObjectDisposedException">瀵硅薄宸查噴鏀�</exception>
public void WriteBytes(string address, byte[] data)
{
if (_disposed)
throw new ObjectDisposedException(nameof(MemoryStore));
- if (string.IsNullOrEmpty(address))
- throw new ArgumentException("鍦板潃涓嶈兘涓虹┖", nameof(address));
+ if (string.IsNullOrWhiteSpace(address))
+ throw new ArgumentException("鍦板潃涓嶈兘涓虹┖鎴栫┖鐧�", nameof(address));
if (data == null)
throw new ArgumentNullException(nameof(data));
@@ -160,14 +180,21 @@
/// <summary>
/// 鍐欏叆鎸囧畾绫诲瀷鏁版嵁
+ /// 鏀寔鐨勭被鍨嬶細bool, short, int, ushort, float
+ /// 娉ㄦ剰锛歴tring绫诲瀷涓嶅彈鏀寔锛岃浣跨敤WriteBytes/ReadBytes鎴栭�氳繃DBRegion鐩存帴璁块棶
/// </summary>
+ /// <typeparam name="T">鍊肩被鍨嬶紙bool, short, int, ushort, float锛�</typeparam>
+ /// <param name="address">鍦板潃</param>
+ /// <param name="value">鏁版嵁鍊�</param>
+ /// <exception cref="ArgumentException">鍦板潃涓虹┖鎴栫┖鐧斤紝鎴栫被鍨嬩笉鏀寔</exception>
+ /// <exception cref="ObjectDisposedException">瀵硅薄宸查噴鏀�</exception>
public void Write<T>(string address, T value) where T : struct
{
if (_disposed)
throw new ObjectDisposedException(nameof(MemoryStore));
- if (string.IsNullOrEmpty(address))
- throw new ArgumentException("鍦板潃涓嶈兘涓虹┖", nameof(address));
+ if (string.IsNullOrWhiteSpace(address))
+ throw new ArgumentException("鍦板潃涓嶈兘涓虹┖鎴栫┖鐧�", nameof(address));
var (regionType, offset, dbNumber, bitOffset) = ParseAddress(address);
@@ -198,7 +225,13 @@
/// <summary>
/// 鑾峰彇鍐呭瓨鍖哄煙
+ /// 璀﹀憡锛氳繑鍥炵殑鍖哄煙鏄彲鍙樼殑鐩存帴寮曠敤锛岃皟鐢ㄨ�呰礋璐g敓鍛藉懆鏈熷崗璋冦��
+ /// 姝ゆ柟娉曚富瑕佺敤浜庨珮绾у満鏅拰鍐呴儴浣跨敤銆備竴鑸儏鍐典笅搴斾娇鐢≧ead/Write鏂规硶銆�
/// </summary>
+ /// <param name="regionType">鍖哄煙绫诲瀷锛圡/DB/I/Q/T/C锛�</param>
+ /// <returns>鍐呭瓨鍖哄煙鎺ュ彛</returns>
+ /// <exception cref="ArgumentException">鍖哄煙绫诲瀷涓嶆敮鎸�</exception>
+ /// <exception cref="ObjectDisposedException">瀵硅薄宸查噴鏀�</exception>
public IMemoryRegion GetRegion(string regionType)
{
if (_disposed)
@@ -219,6 +252,7 @@
/// <summary>
/// 娓呯┖鎵�鏈夊唴瀛�
/// </summary>
+ /// <exception cref="ObjectDisposedException">瀵硅薄宸查噴鏀�</exception>
public void Clear()
{
if (_disposed)
@@ -234,7 +268,11 @@
/// <summary>
/// 瀵煎嚭鍐呭瓨鏁版嵁
+ /// 璀﹀憡锛氳繖鏄竴涓槀璐电殑鎿嶄綔锛屼細鍒嗛厤澶ч噺鍐呭瓨骞跺鍒舵墍鏈夊尯鍩熸暟鎹��
+ /// 寤鸿浠呭湪闇�瑕佹寔涔呭寲鎴栬皟璇曟椂浣跨敤銆�
/// </summary>
+ /// <returns>鍖哄煙绫诲瀷 -> 瀛楄妭鏁扮粍鐨勫瓧鍏�</returns>
+ /// <exception cref="ObjectDisposedException">瀵硅薄宸查噴鏀�</exception>
public Dictionary<string, byte[]> Export()
{
if (_disposed)
@@ -253,7 +291,13 @@
/// <summary>
/// 瀵煎叆鍐呭瓨鏁版嵁
+ /// 浼氶獙璇佹暟鎹暱搴︽槸鍚﹀尮閰嶅尯鍩熷ぇ灏忥紝涓嶅尮閰嶆椂浼氭姏鍑哄紓甯搞��
+ /// DB鍖烘敮鎸佽嚜鍔ㄥ垱寤哄潡锛堝鏋滃啓鍏ユ椂鍧椾笉瀛樺湪锛夈��
/// </summary>
+ /// <param name="data">鍖哄煙绫诲瀷 -> 瀛楄妭鏁扮粍鐨勫瓧鍏�</param>
+ /// <exception cref="ArgumentNullException">鏁版嵁涓簄ull</exception>
+ /// <exception cref="ArgumentException">鏁版嵁闀垮害涓嶅尮閰�</exception>
+ /// <exception cref="ObjectDisposedException">瀵硅薄宸查噴鏀�</exception>
public void Import(Dictionary<string, byte[]> data)
{
if (_disposed)
@@ -263,76 +307,115 @@
throw new ArgumentNullException(nameof(data));
if (data.ContainsKey("M"))
+ {
+ if (data["M"].Length != _config.MRegionSize)
+ throw new ArgumentException($"M鍖烘暟鎹暱搴︿笉鍖归厤锛氭湡鏈泏_config.MRegionSize}锛屽疄闄厈data["M"].Length}");
_mRegion.Write(0, data["M"]);
+ }
+
if (data.ContainsKey("DB"))
+ {
ImportDBRegion(data["DB"]);
+ }
+
if (data.ContainsKey("I"))
+ {
+ if (data["I"].Length != _config.IRegionSize)
+ throw new ArgumentException($"I鍖烘暟鎹暱搴︿笉鍖归厤锛氭湡鏈泏_config.IRegionSize}锛屽疄闄厈data["I"].Length}");
_iRegion.Write(0, data["I"]);
+ }
+
if (data.ContainsKey("Q"))
+ {
+ if (data["Q"].Length != _config.QRegionSize)
+ throw new ArgumentException($"Q鍖烘暟鎹暱搴︿笉鍖归厤锛氭湡鏈泏_config.QRegionSize}锛屽疄闄厈data["Q"].Length}");
_qRegion.Write(0, data["Q"]);
+ }
+
if (data.ContainsKey("T"))
+ {
+ var expectedTSize = _config.TRegionCount * 2; // 姣忎釜瀹氭椂鍣�2瀛楄妭
+ if (data["T"].Length != expectedTSize)
+ throw new ArgumentException($"T鍖烘暟鎹暱搴︿笉鍖归厤锛氭湡鏈泏expectedTSize}锛屽疄闄厈data["T"].Length}");
_tRegion.Write(0, data["T"]);
+ }
+
if (data.ContainsKey("C"))
+ {
+ var expectedCSize = _config.CRegionCount * 2; // 姣忎釜璁℃暟鍣�2瀛楄妭
+ if (data["C"].Length != expectedCSize)
+ throw new ArgumentException($"C鍖烘暟鎹暱搴︿笉鍖归厤锛氭湡鏈泏expectedCSize}锛屽疄闄厈data["C"].Length}");
_cRegion.Write(0, data["C"]);
+ }
}
/// <summary>
/// 瑙f瀽S7鍦板潃鏍煎紡
/// 鏀寔鏍煎紡: M100, DB1.DBD0, I0.0, Q0.0, T1, C1
/// </summary>
+ /// <param name="address">鍦板潃瀛楃涓�</param>
+ /// <returns>瑙f瀽缁撴灉锛氬尯鍩熺被鍨嬨�佸亸绉婚噺銆丏B缂栧彿锛堝彲閫夛級銆佷綅鍋忕Щ锛堝彲閫夛級</returns>
+ /// <exception cref="FormatException">鍦板潃鏍煎紡鏃犳晥鏃舵姏鍑猴紝鍖呭惈璇︾粏鐨勪笂涓嬫枃淇℃伅</exception>
private (string regionType, ushort offset, ushort? dbNumber, byte? bitOffset) ParseAddress(string address)
{
address = address.Trim().ToUpper();
- // DB鍧楀湴鍧�: DB1.DBD0, DB1.DBW10, DB1.DBB20
- if (address.StartsWith("DB"))
+ try
{
- var parts = address.Split(new[] { '.' }, 2);
- var dbPart = parts[0]; // DB1
- var offsetPart = parts.Length > 1 ? parts[1] : null; // DBD0, DBW10, etc.
-
- var dbNumber = ushort.Parse(dbPart.Substring(2));
- ushort offset = 0;
-
- if (offsetPart != null)
+ // DB鍧楀湴鍧�: DB1.DBD0, DB1.DBW10, DB1.DBB20
+ if (address.StartsWith("DB"))
{
- // 瑙f瀽鍋忕Щ绫诲瀷: DBD(4瀛楄妭), DBW(2瀛楄妭), DBB(1瀛楄妭)
- if (offsetPart.StartsWith("DBD"))
- offset = ushort.Parse(offsetPart.Substring(3));
- else if (offsetPart.StartsWith("DBW"))
- offset = ushort.Parse(offsetPart.Substring(3));
- else if (offsetPart.StartsWith("DBB"))
- offset = ushort.Parse(offsetPart.Substring(3));
- else
- offset = ushort.Parse(offsetPart);
+ var parts = address.Split(new[] { '.' }, 2);
+ var dbPart = parts[0]; // DB1
+ var offsetPart = parts.Length > 1 ? parts[1] : null; // DBD0, DBW10, etc.
+
+ var dbNumber = ushort.Parse(dbPart.Substring(2));
+ ushort offset = 0;
+
+ if (offsetPart != null)
+ {
+ // 瑙f瀽鍋忕Щ绫诲瀷: DBD(4瀛楄妭), DBW(2瀛楄妭), DBB(1瀛楄妭)
+ if (offsetPart.StartsWith("DBD"))
+ offset = ushort.Parse(offsetPart.Substring(3));
+ else if (offsetPart.StartsWith("DBW"))
+ offset = ushort.Parse(offsetPart.Substring(3));
+ else if (offsetPart.StartsWith("DBB"))
+ offset = ushort.Parse(offsetPart.Substring(3));
+ else
+ offset = ushort.Parse(offsetPart);
+ }
+
+ return ("DB", offset, dbNumber, null);
}
- return ("DB", offset, dbNumber, null);
- }
+ // 甯︿綅鍦板潃: I0.0, Q0.0, M0.0
+ if (address.Contains("."))
+ {
+ var parts = address.Split('.');
+ var regionType = new string(parts[0].TakeWhile(char.IsLetter).ToArray());
+ var byteOffset = ushort.Parse(new string(parts[0].SkipWhile(char.IsLetter).ToArray()));
+ var bitOffset = byte.Parse(parts[1]);
- // 甯︿綅鍦板潃: I0.0, Q0.0, M0.0
- if (address.Contains("."))
+ return (regionType, byteOffset, null, (byte?)bitOffset);
+ }
+
+ // 瀹氭椂鍣�/璁℃暟鍣�: T1, C1
+ if (address.StartsWith("T") || address.StartsWith("C"))
+ {
+ var regionType = address[0].ToString();
+ var number = ushort.Parse(address.Substring(1));
+ return (regionType, number, null, null);
+ }
+
+ // 鏅�氬湴鍧�: M100, I100, Q100
+ var region = new string(address.TakeWhile(char.IsLetter).ToArray());
+ var addr = ushort.Parse(new string(address.SkipWhile(char.IsLetter).ToArray()));
+ return (region, addr, null, null);
+ }
+ catch (Exception ex) when (ex is FormatException || ex is OverflowException)
{
- var parts = address.Split('.');
- var regionType = new string(parts[0].TakeWhile(char.IsLetter).ToArray());
- var byteOffset = ushort.Parse(new string(parts[0].SkipWhile(char.IsLetter).ToArray()));
- var bitOffset = byte.Parse(parts[1]);
-
- return (regionType, byteOffset, null, (byte?)bitOffset);
+ throw new FormatException($"鍦板潃鏍煎紡鏃犳晥: '{address}'銆倇ex.Message}", ex);
}
-
- // 瀹氭椂鍣�/璁℃暟鍣�: T1, C1
- if (address.StartsWith("T") || address.StartsWith("C"))
- {
- var regionType = address[0].ToString();
- var number = ushort.Parse(address.Substring(1));
- return (regionType, number, null, null);
- }
-
- // 鏅�氬湴鍧�: M100, I100, Q100
- var region = new string(address.TakeWhile(char.IsLetter).ToArray());
- var addr = ushort.Parse(new string(address.SkipWhile(char.IsLetter).ToArray()));
- return (region, addr, null, null);
}
/// <summary>
@@ -344,13 +427,15 @@
var data = _mRegion.Read(offset, (ushort)size);
if (typeof(T) == typeof(bool))
- return default; // M鍖轰笉鏀寔bool璇诲彇锛屽簲璇ョ敤Mx.x鏍煎紡
+ throw new NotSupportedException("M鍖轰笉鏀寔bool璇诲彇锛屽簲璇ヤ娇鐢∕x.x鏍煎紡锛堜綅鍦板潃锛�");
return ConvertFromBytes<T>(data);
}
/// <summary>
/// 璇诲彇DB鍖烘暟鎹�
+ /// 娉ㄦ剰锛歴tring绫诲瀷涓嶅彈姝ゆ硾鍨嬫柟娉曟敮鎸侊紙鍙梬here T : struct绾︽潫锛�
+ /// 璇蜂娇鐢╓riteBytes/ReadBytes鎴栭�氳繃DBRegion鐩存帴璁块棶瀛楃涓�
/// </summary>
private T ReadDBRegion<T>(ushort dbNumber, ushort offset) where T : struct
{
@@ -360,7 +445,8 @@
"Int16" => (T)(object)_dbRegion.ReadInt(dbNumber, offset),
"Int32" => (T)(object)_dbRegion.ReadDInt(dbNumber, offset),
"Single" => (T)(object)_dbRegion.ReadReal(dbNumber, offset),
- "String" => (T)(object)_dbRegion.ReadString(dbNumber, offset, 254),
+ // String绫诲瀷鍦ㄦ硾鍨嬬害鏉熶笅涓嶅彲杈撅紝浣嗕繚鐣欐敞閲婅鏄�
+ // "String" => (T)(object)_dbRegion.ReadString(dbNumber, offset, 254),
_ => ConvertFromBytes<T>(_dbRegion.Read(dbNumber, offset, (ushort)System.Runtime.InteropServices.Marshal.SizeOf<T>()))
};
}
@@ -418,6 +504,8 @@
/// <summary>
/// 鍐欏叆DB鍖烘暟鎹�
+ /// 娉ㄦ剰锛歴tring绫诲瀷涓嶅彈姝ゆ硾鍨嬫柟娉曟敮鎸侊紙鍙梬here T : struct绾︽潫锛�
+ /// 璇蜂娇鐢╓riteBytes/ReadBytes鎴栭�氳繃DBRegion鐩存帴璁块棶瀛楃涓�
/// </summary>
private void WriteDBRegion<T>(ushort dbNumber, ushort offset, T value) where T : struct
{
@@ -435,9 +523,10 @@
case "Single":
_dbRegion.WriteReal(dbNumber, offset, (float)(object)value);
break;
- case "String":
- _dbRegion.WriteString(dbNumber, offset, (string)(object)value, 254);
- break;
+ // String绫诲瀷鍦ㄦ硾鍨嬬害鏉熶笅涓嶅彲杈撅紝浣嗕繚鐣欐敞閲婅鏄�
+ // case "String":
+ // _dbRegion.WriteString(dbNumber, offset, (string)(object)value, 254);
+ // break;
default:
var data = ConvertToBytes(value);
_dbRegion.Write(dbNumber, offset, data);
@@ -493,7 +582,9 @@
/// <summary>
/// 浠庡瓧鑺傛暟缁勮浆鎹负鍊肩被鍨�
+ /// 浣跨敤澶х瀛楄妭搴忥紙Big-Endian锛夛紝涓嶴7 PLC瑙勮寖涓�鑷�
/// </summary>
+ /// <exception cref="NotSupportedException">绫诲瀷涓嶆敮鎸佹椂鎶涘嚭</exception>
private T ConvertFromBytes<T>(byte[] data) where T : struct
{
if (typeof(T) == typeof(short))
@@ -505,15 +596,31 @@
if (typeof(T) == typeof(ushort))
return (T)(object)((ushort)((data[0] << 8) | data[1]));
- if (typeof(T) == typeof(float))
- return (T)(object)BitConverter.ToSingle(data, 0);
+ if (typeof(T) == typeof(uint))
+ return (T)(object)((uint)((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]));
- return default;
+ if (typeof(T) == typeof(float))
+ {
+ // BitConverter榛樿浣跨敤绯荤粺瀛楄妭搴忥紝闇�瑕佽浆鎹负澶х
+ if (BitConverter.IsLittleEndian)
+ Array.Reverse(data);
+ return (T)(object)BitConverter.ToSingle(data, 0);
+ }
+
+ if (typeof(T) == typeof(bool))
+ return (T)(object)(data[0] != 0);
+
+ if (typeof(T) == typeof(byte))
+ return (T)(object)data[0];
+
+ throw new NotSupportedException($"涓嶆敮鎸佺殑绫诲瀷: {typeof(T).Name}銆傛敮鎸佺殑绫诲瀷锛歜ool, byte, short, int, ushort, uint, float");
}
/// <summary>
/// 灏嗗�肩被鍨嬭浆鎹负瀛楄妭鏁扮粍
+ /// 浣跨敤澶х瀛楄妭搴忥紙Big-Endian锛夛紝涓嶴7 PLC瑙勮寖涓�鑷�
/// </summary>
+ /// <exception cref="NotSupportedException">绫诲瀷涓嶆敮鎸佹椂鎶涘嚭</exception>
private byte[] ConvertToBytes<T>(T value) where T : struct
{
if (typeof(T) == typeof(short))
@@ -530,37 +637,64 @@
if (typeof(T) == typeof(ushort))
return new[] { (byte)((ushort)(object)value >> 8), (byte)((ushort)(object)value & 0xFF) };
+ if (typeof(T) == typeof(uint))
+ return new[] {
+ (byte)((uint)(object)value >> 24),
+ (byte)(((uint)(object)value >> 16) & 0xFF),
+ (byte)(((uint)(object)value >> 8) & 0xFF),
+ (byte)((uint)(object)value & 0xFF)
+ };
+
if (typeof(T) == typeof(float))
- return BitConverter.GetBytes((float)(object)value);
+ {
+ var bytes = BitConverter.GetBytes((float)(object)value);
+ // BitConverter榛樿浣跨敤绯荤粺瀛楄妭搴忥紝闇�瑕佽浆鎹负澶х
+ if (BitConverter.IsLittleEndian)
+ Array.Reverse(bytes);
+ return bytes;
+ }
if (typeof(T) == typeof(bool))
return new[] { (byte)((bool)(object)value ? 1 : 0) };
- throw new NotSupportedException($"涓嶆敮鎸佺殑绫诲瀷: {typeof(T).Name}");
+ if (typeof(T) == typeof(byte))
+ return new[] { (byte)(object)value };
+
+ throw new NotSupportedException($"涓嶆敮鎸佺殑绫诲瀷: {typeof(T).Name}銆傛敮鎸佺殑绫诲瀷锛歜ool, byte, short, int, ushort, uint, float");
}
/// <summary>
/// 瀵煎嚭DB鍖烘暟鎹�
+ /// 瀵煎嚭鎵�鏈塂B鍧楃殑杩炵画鏁版嵁
+ /// 娉ㄦ剰锛欴B鍖烘敮鎸佽嚜鍔ㄥ垱寤哄潡锛屽鍑烘椂鍙寘鍚凡鍒涘缓鐨勫潡
/// </summary>
private byte[] ExportDBRegion()
{
- // 绠�鍖栫増鏈細瀵煎嚭鎵�鏈塂B鍧楃殑杩炵画鏁版嵁
- // 瀹為檯瀹炵幇鍙兘闇�瑕佹洿澶嶆潅鐨勫簭鍒楀寲鏍煎紡
var result = new List<byte>();
for (ushort i = 1; i <= _config.DBBlockCount; i++)
{
- var blockData = _dbRegion.Read(i, 0, (ushort)_config.DBBlockSize);
- result.AddRange(blockData);
+ try
+ {
+ var blockData = _dbRegion.Read(i, 0, (ushort)_config.DBBlockSize);
+ result.AddRange(blockData);
+ }
+ catch (ArgumentException)
+ {
+ // DB鍧椾笉瀛樺湪锛岃烦杩�
+ // 濉厖0浠ヤ繚鎸佽繛缁��
+ result.AddRange(new byte[_config.DBBlockSize]);
+ }
}
return result.ToArray();
}
/// <summary>
/// 瀵煎叆DB鍖烘暟鎹�
+ /// 鎸夐『搴忓鍏ユ墍鏈塂B鍧�
+ /// 娉ㄦ剰锛欴B鍖烘敮鎸佽嚜鍔ㄥ垱寤哄潡锛堝鏋滃啓鍏ユ椂鍧椾笉瀛樺湪锛�
/// </summary>
private void ImportDBRegion(byte[] data)
{
- // 绠�鍖栫増鏈細鎸夐『搴忓鍏ユ墍鏈塂B鍧�
int offset = 0;
for (ushort i = 1; i <= _config.DBBlockCount && offset < data.Length; i++)
{
--
Gitblit v1.9.3