XFEExtension
【DLL】XFE各类拓展是一个C#的DLL库,旨在优化C#代码中常用语句的使用,并提供更简洁的访问方式,同时提供Xunit测试框架,快速搭建服务器/客户端,免费ChatGPTAPI接口,免费通讯服务器,XFE下载器,新增格式等
关注
0
Fork
0
Star
0
返回提交历史
Modified
XFEExtension.NetCore/CyberComm/XCCNetWork/XCCMessage.cs
+5
-6
Modified
XFEExtension.NetCore/FileExtension/XFEPackage/XFEPackage.cs
+1
-2
Modified
XFEExtension.NetCore/FormatExtension/XFEMultiDictionary.cs
+1
-1
Modified
XFEExtension.NetCore/ListExtension/ListExtension.cs
+5
-21
Modified
XFEExtension.NetCore/ReflectionExtension/ReflectionExtension.cs
+1
-1
Modified
XFEExtension.NetCore/WebExtension/XFEDownloader.cs
+21
-31
XFEstudio/XFEExtension
重构与现代化:优化流处理与代码简洁性
重构多处代码以提升现代性和可读性,包括: - 使用 `await using` 优化异步流资源释放 - `ToString`/`Enum.Parse` 等方法更符合当前区域和类型安全 - 用 `Aggregate` 简化 List 扩展方法 - 移除未用字段,简化属性定义 - 增强流操作的取消支持和资源释放逻辑 整体提升了健壮性、性能和维护性。
b995ef4
代码差异
6 个文件
+34
-62
@@ -1,4 +1,5 @@
1
using XFEExtension.NetCore.ArrayExtension;
1
using System.Globalization;
2
using XFEExtension.NetCore.ArrayExtension;
2
3
3
4
namespace XFEExtension.NetCore.CyberComm.XCCNetWork;
4
5
@@ -44,10 +45,8 @@ public class XCCMessage(string messageId, XCCTextMessageType messageType, string
44
45
/// 封装为字符串
45
46
/// </summary>
46
47
/// <returns></returns>
47
public override string ToString()
48
{
49
return new[] { MessageId, MessageType.ToString(), Message, Sender, SendTime.ToString() }.ToXFEString();
50
}
48
public override string ToString() => new[] { MessageId, MessageType.ToString(), Message, Sender, SendTime.ToString(CultureInfo.CurrentCulture) }.ToXFEString();
49
51
50
/// <summary>
52
51
/// 将封装后的XCC消息字符串转换为XCC消息对象
53
52
/// </summary>
@@ -57,6 +56,6 @@ public class XCCMessage(string messageId, XCCTextMessageType messageType, string
57
56
public static XCCMessage ConvertToXCCMessage(string xCCMessageStringFormat, string groupId)
58
57
{
59
58
var unPackedMessage = xCCMessageStringFormat.ToXFEArray<string>();
60
return new XCCMessage(unPackedMessage[0], (XCCTextMessageType)Enum.Parse(typeof(XCCTextMessageType), unPackedMessage[1]), unPackedMessage[2], unPackedMessage[3], DateTime.Parse(unPackedMessage[4]), groupId);
59
return new XCCMessage(unPackedMessage[0], Enum.Parse<XCCTextMessageType>(unPackedMessage[1]), unPackedMessage[2], unPackedMessage[3], DateTime.Parse(unPackedMessage[4]), groupId);
61
60
}
62
61
}
@@ -68,9 +68,8 @@ public static class XFEPackage
68
68
internal static XFEPackagedDirectory GetFilePackage(byte[] filePackageBytes)
69
69
{
70
70
var buffer = XFEBuffer.ToXFEBuffer(filePackageBytes);
71
if (buffer.FirstOrDefault() is KeyValuePair<string, byte[]> keyValuePair)
71
if (buffer.FirstOrDefault() is var keyValuePair)
72
72
return GetFilePackageRecursion(keyValuePair.Key, keyValuePair.Value);
73
return new XFEPackagedDirectory();
74
73
}
75
74
76
75
internal static XFEPackagedDirectory GetFilePackageRecursion(string packageName, byte[] filePackageBytes)
@@ -148,7 +148,7 @@ public class XFEMultiDictionary : ICollection<XFEEntry>
148
148
public List<string> GetContents(string header)
149
149
{
150
150
var list = new List<string>();
151
_xFEMultiDictionaryList.FindAll(x => x.Header == header)?.ForEach(y => list.Add(y.Content));
151
_xFEMultiDictionaryList.FindAll(x => x.Header == header).ForEach(y => list.Add(y.Content));
152
152
return list;
153
153
}
154
154
/// <summary>
@@ -11,16 +11,8 @@ public static class ListExtension
11
11
/// <typeparam name="T"></typeparam>
12
12
/// <param name="list"></param>
13
13
/// <returns></returns>
14
public static string ToXFEString<T>(this List<T> list)
15
{
16
var str = string.Empty;
17
foreach (var ary in list)
18
{
19
if (ary is not null)
20
str += $"[+-{ary.ToString()?.Replace("[+", "[++").Replace("+]", "++]")}-+]";
21
}
22
return str;
23
}
14
public static string ToXFEString<T>(this List<T> list) => list.Aggregate(string.Empty, (current, ary) => current + $"[+-{ary?.ToString()?.Replace("[+", "[++").Replace("+]", "++]")}-+]");
15
24
16
/// <summary>
25
17
/// 将List列表转换为XFE格式字符串
26
18
/// </summary>
@@ -28,16 +20,8 @@ public static class ListExtension
28
20
/// <param name="list"></param>
29
21
/// <param name="propertyName">属性名称</param>
30
22
/// <returns></returns>
31
public static string ToXFEString<T>(this List<T> list, string propertyName) where T : class
32
{
33
var str = string.Empty;
34
foreach (var ary in list)
35
{
36
if (ary is not null)
37
str += $"[+-{ary.GetType().GetProperty(propertyName)?.GetValue(ary)?.ToString()?.Replace("[+", "[++").Replace("+]", "++]")}-+]";
38
}
39
return str;
40
}
23
public static string ToXFEString<T>(this List<T> list, string propertyName) where T : class => list.Aggregate(string.Empty, (current, ary) => current + $"[+-{ary.GetType().GetProperty(propertyName)?.GetValue(ary)?.ToString()?.Replace("[+", "[++").Replace("+]", "++]")}-+]");
24
41
25
/// <summary>
42
26
/// 将XFE格式字符串转换为List列表
43
27
/// </summary>
@@ -46,7 +30,7 @@ public static class ListExtension
46
30
/// <returns>T类型的List列表</returns>
47
31
public static List<T> ToXFEList<T>(this string str)
48
32
{
49
var strings = str.Split(new[] { "[+-", "-+]" }, StringSplitOptions.RemoveEmptyEntries);
33
var strings = str.Split(["[+-", "-+]"], StringSplitOptions.RemoveEmptyEntries);
50
34
var list = new List<T>();
51
35
for (var j = 1; j < strings.Length - 1; j += 2)
52
36
{
@@ -15,7 +15,7 @@ public static class ReflectionExtension
15
15
public static object?[] GetDefaultParameters(this MethodInfo method)
16
16
{
17
17
var parameters = method.GetParameters();
18
var defaultParameters = new object[parameters.Length];
18
var defaultParameters = new object?[parameters.Length];
19
19
for (var i = 0; i < parameters.Length; i++)
20
20
{
21
21
var paramType = parameters[i].ParameterType;
@@ -14,7 +14,6 @@ public class XFEDownloader : IDisposable
14
14
private bool _disposedValue;
15
15
private readonly List<HttpClient> _httpClientList = [];
16
16
private HttpResponseMessage? _responseMessage;
17
private readonly List<HttpResponseMessage> _httpResponseMessages = [];
18
17
private readonly List<Task> _downloadTasks = [];
19
18
/// <summary>
20
19
/// 字节下载事件
@@ -36,15 +35,11 @@ public class XFEDownloader : IDisposable
36
35
/// 已下载
37
36
/// </summary>
38
37
public bool Downloaded { get; private set; }
39
private bool _isPaused;
38
40
39
/// <summary>
41
40
/// 暂停
42
41
/// </summary>
43
public bool IsPaused
44
{
45
get { return _isPaused; }
46
set { _isPaused = value; }
47
}
42
public bool IsPaused { get; set; }
48
43
49
44
/// <summary>
50
45
/// 开始下载
@@ -58,7 +53,7 @@ public class XFEDownloader : IDisposable
58
53
var getInfoClient = new HttpClient();
59
54
_responseMessage ??= await GetHttpResponseMessage(getInfoClient, CancellationToken.None);
60
55
var totalFileSize = _responseMessage.Content.Headers.ContentLength;
61
using var createFileStream = new FileStream(SavePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite, 8192, true);
56
await using var createFileStream = new FileStream(SavePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite, 8192, true);
62
57
if (totalFileSize is not null)
63
58
createFileStream.SetLength(totalFileSize.Value);
64
59
for (var i = 0; i < FileSegmentCount; i++)
@@ -66,7 +61,7 @@ public class XFEDownloader : IDisposable
66
61
var currentSegment = i;
67
62
_downloadTasks.Add(Task.Run(async () =>
68
63
{
69
using var fileStream = new FileStream(SavePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite, 8192, true);
64
await using var fileStream = new FileStream(SavePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite, 8192, true);
70
65
var currentSegmentTotalBufferSize = fileStream.Length / FileSegmentCount;
71
66
var endPosition = currentSegment == FileSegmentCount - 1 ? fileStream.Length : currentSegmentTotalBufferSize * (currentSegment + 1);
72
67
var startBufferIndex = currentSegmentTotalBufferSize * currentSegment;
@@ -80,17 +75,17 @@ public class XFEDownloader : IDisposable
80
75
totalRead += currentSegmentDownloadedBuffeSize;
81
76
var cancellationTokenSource = new CancellationTokenSource();
82
77
var cancellationToken = cancellationTokenSource.Token;
83
using var contentStream = await (await GetHttpResponseMessage(httpClient, cancellationToken)).Content.ReadAsStreamAsync(cancellationToken);
78
await using var contentStream = await (await GetHttpResponseMessage(httpClient, cancellationToken)).Content.ReadAsStreamAsync(cancellationToken);
84
79
var buffer = new byte[8192];
85
80
int currentRead;
86
while ((currentRead = await contentStream.ReadAsync(buffer)) > 0 && !_disposedValue)
81
while ((currentRead = await contentStream.ReadAsync(buffer, cancellationToken)) > 0 && !_disposedValue)
87
82
{
88
83
if (IsPaused)
89
84
{
90
85
await cancellationTokenSource.CancelAsync();
91
86
break;
92
87
}
93
await fileStream.WriteAsync(buffer.AsMemory(0, currentRead));
88
await fileStream.WriteAsync(buffer.AsMemory(0, currentRead), cancellationToken);
94
89
totalRead += currentRead;
95
90
currentSegmentDownloadedBuffeSize += currentRead;
96
91
var bufferCopy = new byte[8192];
@@ -141,29 +136,24 @@ public class XFEDownloader : IDisposable
141
136
/// <param name="disposing"></param>
142
137
protected virtual void Dispose(bool disposing)
143
138
{
144
if (!_disposedValue)
139
if (_disposedValue)
140
return;
141
if (disposing)
145
142
{
146
if (disposing)
143
_responseMessage?.Dispose();
144
foreach (var httpClient in _httpClientList)
147
145
{
148
_responseMessage?.Dispose();
149
foreach (var httpClient in _httpClientList)
150
{
151
httpClient.Dispose();
152
}
153
foreach (var response in _httpResponseMessages)
154
{
155
response.Dispose();
156
}
157
foreach (var task in _downloadTasks)
158
{
159
task.Dispose();
160
}
146
httpClient.Dispose();
147
}
148
foreach (var task in _downloadTasks)
149
{
150
task.Dispose();
161
151
}
162
163
// TODO: 释放未托管的资源(未托管的对象)并重写终结器
164
// TODO: 将大型字段设置为 null
165
_disposedValue = true;
166
152
}
153
154
// TODO: 释放未托管的资源(未托管的对象)并重写终结器
155
// TODO: 将大型字段设置为 null
156
_disposedValue = true;
167
157
}
168
158
/// <summary>
169
159
/// 释放资源