v3.8.4.0 1、增加Ngrok功能。2、调整倒计时控件宽度,修复当倒计时超过3位时被遮挡的问题。3、精简代码。
This commit is contained in:
parent
19a7c32e6e
commit
314d964e48
161
net.nutcore.aliddns/net.nutcore.aliddns/EncryptHelper.cs
Normal file
161
net.nutcore.aliddns/net.nutcore.aliddns/EncryptHelper.cs
Normal file
@ -0,0 +1,161 @@
|
||||
using System;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
|
||||
namespace net.nutcore.aliddns
|
||||
{
|
||||
/// <summary>
|
||||
/// 加密工具类
|
||||
/// </summary>
|
||||
public class EncryptHelper
|
||||
{
|
||||
//默认密钥
|
||||
private static string AESKey = "[45/*YUIdse..e;]";
|
||||
private static string DESKey = "[&HdN72]";
|
||||
|
||||
/// <summary>
|
||||
/// AES加密
|
||||
/// </summary>
|
||||
public static string AESEncrypt(string value, string _aeskey = null)
|
||||
{
|
||||
if (string.IsNullOrEmpty(_aeskey))
|
||||
{
|
||||
_aeskey = AESKey;
|
||||
}
|
||||
|
||||
byte[] keyArray = Encoding.UTF8.GetBytes(_aeskey);
|
||||
byte[] toEncryptArray = Encoding.UTF8.GetBytes(value);
|
||||
|
||||
RijndaelManaged rDel = new RijndaelManaged();
|
||||
rDel.Key = keyArray;
|
||||
rDel.Mode = CipherMode.ECB;
|
||||
rDel.Padding = PaddingMode.PKCS7;
|
||||
|
||||
ICryptoTransform cTransform = rDel.CreateEncryptor();
|
||||
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
|
||||
|
||||
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// AES解密
|
||||
/// </summary>
|
||||
public static string AESDecrypt(string value, string _aeskey = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (string.IsNullOrEmpty(_aeskey))
|
||||
{
|
||||
_aeskey = AESKey;
|
||||
}
|
||||
byte[] keyArray = Encoding.UTF8.GetBytes(_aeskey);
|
||||
byte[] toEncryptArray = Convert.FromBase64String(value);
|
||||
|
||||
RijndaelManaged rDel = new RijndaelManaged();
|
||||
rDel.Key = keyArray;
|
||||
rDel.Mode = CipherMode.ECB;
|
||||
rDel.Padding = PaddingMode.PKCS7;
|
||||
|
||||
ICryptoTransform cTransform = rDel.CreateDecryptor();
|
||||
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
|
||||
|
||||
return Encoding.UTF8.GetString(resultArray);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// DES加密
|
||||
/// </summary>
|
||||
public static string DESEncrypt(string value, string _deskey = null)
|
||||
{
|
||||
if (string.IsNullOrEmpty(_deskey))
|
||||
{
|
||||
_deskey = DESKey;
|
||||
}
|
||||
|
||||
byte[] keyArray = Encoding.UTF8.GetBytes(_deskey);
|
||||
byte[] toEncryptArray = Encoding.UTF8.GetBytes(value);
|
||||
|
||||
DESCryptoServiceProvider rDel = new DESCryptoServiceProvider();
|
||||
rDel.Key = keyArray;
|
||||
rDel.Mode = CipherMode.ECB;
|
||||
rDel.Padding = PaddingMode.PKCS7;
|
||||
|
||||
ICryptoTransform cTransform = rDel.CreateEncryptor();
|
||||
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
|
||||
|
||||
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// DES解密
|
||||
/// </summary>
|
||||
public static string DESDecrypt(string value, string _deskey = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (string.IsNullOrEmpty(_deskey))
|
||||
{
|
||||
_deskey = DESKey;
|
||||
}
|
||||
byte[] keyArray = Encoding.UTF8.GetBytes(_deskey);
|
||||
byte[] toEncryptArray = Convert.FromBase64String(value);
|
||||
|
||||
DESCryptoServiceProvider rDel = new DESCryptoServiceProvider();
|
||||
rDel.Key = keyArray;
|
||||
rDel.Mode = CipherMode.ECB;
|
||||
rDel.Padding = PaddingMode.PKCS7;
|
||||
|
||||
ICryptoTransform cTransform = rDel.CreateDecryptor();
|
||||
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
|
||||
|
||||
return Encoding.UTF8.GetString(resultArray);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
public static string MD5(string value)
|
||||
{
|
||||
byte[] result = Encoding.UTF8.GetBytes(value);
|
||||
MD5 md5 = new MD5CryptoServiceProvider();
|
||||
byte[] output = md5.ComputeHash(result);
|
||||
return BitConverter.ToString(output).Replace("-", "");
|
||||
}
|
||||
|
||||
public static string HMACMD5(string value, string hmacKey)
|
||||
{
|
||||
HMACSHA1 hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(hmacKey));
|
||||
byte[] result = System.Text.Encoding.UTF8.GetBytes(value);
|
||||
byte[] output = hmacsha1.ComputeHash(result);
|
||||
|
||||
|
||||
return BitConverter.ToString(output).Replace("-", "");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// base64编码
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static string Base64Encode(string value)
|
||||
{
|
||||
string result = Convert.ToBase64String(Encoding.Default.GetBytes(value));
|
||||
return result;
|
||||
}
|
||||
/// <summary>
|
||||
/// base64解码
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static string Base64Decode(string value)
|
||||
{
|
||||
string result = Encoding.Default.GetString(Convert.FromBase64String(value));
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
@ -189,13 +189,13 @@
|
||||
//
|
||||
// label_nextUpdateSeconds
|
||||
//
|
||||
this.label_nextUpdateSeconds.AutoSize = true;
|
||||
this.label_nextUpdateSeconds.ForeColor = System.Drawing.Color.Red;
|
||||
this.label_nextUpdateSeconds.Location = new System.Drawing.Point(97, 99);
|
||||
this.label_nextUpdateSeconds.Location = new System.Drawing.Point(87, 99);
|
||||
this.label_nextUpdateSeconds.Name = "label_nextUpdateSeconds";
|
||||
this.label_nextUpdateSeconds.Size = new System.Drawing.Size(17, 12);
|
||||
this.label_nextUpdateSeconds.Size = new System.Drawing.Size(30, 12);
|
||||
this.label_nextUpdateSeconds.TabIndex = 3;
|
||||
this.label_nextUpdateSeconds.Text = "60";
|
||||
this.label_nextUpdateSeconds.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
||||
//
|
||||
// updateNow
|
||||
//
|
||||
|
@ -6,7 +6,6 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Windows.Forms;
|
||||
@ -914,161 +913,4 @@ namespace net.nutcore.aliddns
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 加密工具类
|
||||
/// </summary>
|
||||
public class EncryptHelper
|
||||
{
|
||||
//默认密钥
|
||||
private static string AESKey = "[45/*YUIdse..e;]";
|
||||
private static string DESKey = "[&HdN72]";
|
||||
|
||||
/// <summary>
|
||||
/// AES加密
|
||||
/// </summary>
|
||||
public static string AESEncrypt(string value, string _aeskey = null)
|
||||
{
|
||||
if (string.IsNullOrEmpty(_aeskey))
|
||||
{
|
||||
_aeskey = AESKey;
|
||||
}
|
||||
|
||||
byte[] keyArray = Encoding.UTF8.GetBytes(_aeskey);
|
||||
byte[] toEncryptArray = Encoding.UTF8.GetBytes(value);
|
||||
|
||||
RijndaelManaged rDel = new RijndaelManaged();
|
||||
rDel.Key = keyArray;
|
||||
rDel.Mode = CipherMode.ECB;
|
||||
rDel.Padding = PaddingMode.PKCS7;
|
||||
|
||||
ICryptoTransform cTransform = rDel.CreateEncryptor();
|
||||
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
|
||||
|
||||
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// AES解密
|
||||
/// </summary>
|
||||
public static string AESDecrypt(string value, string _aeskey = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (string.IsNullOrEmpty(_aeskey))
|
||||
{
|
||||
_aeskey = AESKey;
|
||||
}
|
||||
byte[] keyArray = Encoding.UTF8.GetBytes(_aeskey);
|
||||
byte[] toEncryptArray = Convert.FromBase64String(value);
|
||||
|
||||
RijndaelManaged rDel = new RijndaelManaged();
|
||||
rDel.Key = keyArray;
|
||||
rDel.Mode = CipherMode.ECB;
|
||||
rDel.Padding = PaddingMode.PKCS7;
|
||||
|
||||
ICryptoTransform cTransform = rDel.CreateDecryptor();
|
||||
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
|
||||
|
||||
return Encoding.UTF8.GetString(resultArray);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// DES加密
|
||||
/// </summary>
|
||||
public static string DESEncrypt(string value, string _deskey = null)
|
||||
{
|
||||
if (string.IsNullOrEmpty(_deskey))
|
||||
{
|
||||
_deskey = DESKey;
|
||||
}
|
||||
|
||||
byte[] keyArray = Encoding.UTF8.GetBytes(_deskey);
|
||||
byte[] toEncryptArray = Encoding.UTF8.GetBytes(value);
|
||||
|
||||
DESCryptoServiceProvider rDel = new DESCryptoServiceProvider();
|
||||
rDel.Key = keyArray;
|
||||
rDel.Mode = CipherMode.ECB;
|
||||
rDel.Padding = PaddingMode.PKCS7;
|
||||
|
||||
ICryptoTransform cTransform = rDel.CreateEncryptor();
|
||||
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
|
||||
|
||||
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// DES解密
|
||||
/// </summary>
|
||||
public static string DESDecrypt(string value, string _deskey = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (string.IsNullOrEmpty(_deskey))
|
||||
{
|
||||
_deskey = DESKey;
|
||||
}
|
||||
byte[] keyArray = Encoding.UTF8.GetBytes(_deskey);
|
||||
byte[] toEncryptArray = Convert.FromBase64String(value);
|
||||
|
||||
DESCryptoServiceProvider rDel = new DESCryptoServiceProvider();
|
||||
rDel.Key = keyArray;
|
||||
rDel.Mode = CipherMode.ECB;
|
||||
rDel.Padding = PaddingMode.PKCS7;
|
||||
|
||||
ICryptoTransform cTransform = rDel.CreateDecryptor();
|
||||
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
|
||||
|
||||
return Encoding.UTF8.GetString(resultArray);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
public static string MD5(string value)
|
||||
{
|
||||
byte[] result = Encoding.UTF8.GetBytes(value);
|
||||
MD5 md5 = new MD5CryptoServiceProvider();
|
||||
byte[] output = md5.ComputeHash(result);
|
||||
return BitConverter.ToString(output).Replace("-", "");
|
||||
}
|
||||
|
||||
public static string HMACMD5(string value, string hmacKey)
|
||||
{
|
||||
HMACSHA1 hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(hmacKey));
|
||||
byte[] result = System.Text.Encoding.UTF8.GetBytes(value);
|
||||
byte[] output = hmacsha1.ComputeHash(result);
|
||||
|
||||
|
||||
return BitConverter.ToString(output).Replace("-", "");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// base64编码
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static string Base64Encode(string value)
|
||||
{
|
||||
string result = Convert.ToBase64String(Encoding.Default.GetBytes(value));
|
||||
return result;
|
||||
}
|
||||
/// <summary>
|
||||
/// base64解码
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static string Base64Decode(string value)
|
||||
{
|
||||
string result = Encoding.Default.GetString(Convert.FromBase64String(value));
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
|
||||
// 方法是按如下所示使用“*”: :
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("3.8.3.5")]
|
||||
[assembly: AssemblyFileVersion("3.8.3.5")]
|
||||
[assembly: AssemblyVersion("3.8.4.0")]
|
||||
[assembly: AssemblyFileVersion("3.8.4.0")]
|
||||
|
@ -88,6 +88,7 @@
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="EncryptHelper.cs" />
|
||||
<Compile Include="Form_About.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
@ -109,7 +110,6 @@
|
||||
<Compile Include="ngrok.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="yml.cs" />
|
||||
<EmbeddedResource Include="Form_About.resx">
|
||||
<DependentUpon>Form_About.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
@ -149,7 +149,9 @@
|
||||
<Content Include="alidns_green.ico" />
|
||||
<Content Include="alidns_red.ico" />
|
||||
<Content Include="alidns_yellow.ico" />
|
||||
<Content Include="updateinfo.txt" />
|
||||
<Content Include="updateinfo.txt">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<None Include="Resources\alidns_yellow.ico" />
|
||||
<None Include="Resources\alidns_red.ico" />
|
||||
<None Include="Resources\alidns_green.ico" />
|
||||
@ -172,7 +174,8 @@
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<PropertyGroup>
|
||||
<PreBuildEvent>copy "$(SolutionDir)net.nutcore.aliddns\updateinfo.txt" "$(TargetDir)"</PreBuildEvent>
|
||||
<PreBuildEvent>
|
||||
</PreBuildEvent>
|
||||
</PropertyGroup>
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
@ -1,3 +1,6 @@
|
||||
v3.8.4.0
|
||||
1、增加Ngrok功能。2、调整倒计时控件宽度,修复当倒计时超过3位时被遮挡的问题。3、精简代码。
|
||||
|
||||
v3.8.3.5
|
||||
1、最近Teamviewer老是出状况,先实现ngrok吧。2、自动升级功能继续调试中...。
|
||||
|
||||
|
@ -1,244 +0,0 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace net.nutcore.aliddns
|
||||
{
|
||||
class YML
|
||||
{
|
||||
// 所有行
|
||||
private String[] lines;
|
||||
// 格式化为节点
|
||||
private List<Node> nodeList = new List<Node>();
|
||||
// 文件所在地址
|
||||
private String path;
|
||||
|
||||
public YML(String path)
|
||||
{
|
||||
this.path = path;
|
||||
this.lines = File.ReadAllLines(path);
|
||||
|
||||
for (int i = 0; i < lines.Length; i++)
|
||||
{
|
||||
String line = lines[i];
|
||||
if (line.Trim() == "")
|
||||
{
|
||||
Console.WriteLine("空白行,行号:" + (i + 1));
|
||||
continue;
|
||||
}
|
||||
else if (line.Trim().Substring(0, 1) == "#")
|
||||
{
|
||||
Console.WriteLine("注释行,行号:" + (i + 1));
|
||||
continue;
|
||||
}
|
||||
|
||||
String[] kv = Regex.Split(line, ":", RegexOptions.IgnoreCase);
|
||||
findPreSpace(line);
|
||||
Node node = new Node();
|
||||
node.space = findPreSpace(line);
|
||||
node.name = kv[0].Trim();
|
||||
|
||||
// 去除前后空白符
|
||||
String fline = line.Trim();
|
||||
int first = fline.IndexOf(':');
|
||||
node.value = first == fline.Length - 1 ? null : fline.Substring(first + 2, fline.Length - first - 2);
|
||||
node.parent = findParent(node.space);
|
||||
nodeList.Add(node);
|
||||
}
|
||||
|
||||
this.formatting();
|
||||
}
|
||||
|
||||
// 修改值 允许key为多级 例如:spring.datasource.url
|
||||
public void modify(String key, String value)
|
||||
{
|
||||
Node node = findNodeByKey(key);
|
||||
if (node != null)
|
||||
{
|
||||
node.value = value;
|
||||
}
|
||||
}
|
||||
|
||||
// 读取值
|
||||
public String read(String key, String value)
|
||||
{
|
||||
Node node = findNodeByKey(key);
|
||||
if (node != null)
|
||||
{
|
||||
return node.value;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// 根据key找节点
|
||||
private Node findNodeByKey(String key)
|
||||
{
|
||||
String[] ks = key.Split('.');
|
||||
for (int i = 0; i < nodeList.Count; i++)
|
||||
{
|
||||
Node node = nodeList[i];
|
||||
if (node.name == ks[ks.Length - 1])
|
||||
{
|
||||
// 判断父级
|
||||
Node tem = node;
|
||||
// 统计匹配到的次数
|
||||
int count = 1;
|
||||
for (int j = ks.Length - 2; j >= 0; j--)
|
||||
{
|
||||
if (tem.parent.name == ks[j])
|
||||
{
|
||||
count++;
|
||||
// 继续检查父级
|
||||
tem = tem.parent;
|
||||
}
|
||||
}
|
||||
|
||||
if (count == ks.Length)
|
||||
{
|
||||
return node;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// 保存到文件中
|
||||
public void save()
|
||||
{
|
||||
StreamWriter stream = File.CreateText(this.path);
|
||||
for (int i = 0; i < nodeList.Count; i++)
|
||||
{
|
||||
Node node = nodeList[i];
|
||||
StringBuilder sb = new StringBuilder();
|
||||
// 放入前置空格
|
||||
for (int j = 0; j < node.tier; j++)
|
||||
{
|
||||
sb.Append(" ");
|
||||
}
|
||||
sb.Append(node.name);
|
||||
sb.Append(": ");
|
||||
if (node.value != null)
|
||||
{
|
||||
sb.Append(node.value);
|
||||
}
|
||||
stream.WriteLine(sb.ToString());
|
||||
}
|
||||
stream.Flush();
|
||||
stream.Close();
|
||||
}
|
||||
|
||||
// 格式化
|
||||
public void formatting()
|
||||
{
|
||||
// 先找出根节点
|
||||
List<Node> parentNode = new List<Node>();
|
||||
for (int i = 0; i < nodeList.Count; i++)
|
||||
{
|
||||
Node node = nodeList[i];
|
||||
if (node.parent == null)
|
||||
{
|
||||
parentNode.Add(node);
|
||||
}
|
||||
}
|
||||
|
||||
List<Node> fNodeList = new List<Node>();
|
||||
// 遍历根节点
|
||||
for (int i = 0; i < parentNode.Count; i++)
|
||||
{
|
||||
Node node = parentNode[i];
|
||||
fNodeList.Add(node);
|
||||
findChildren(node, fNodeList);
|
||||
}
|
||||
|
||||
Console.WriteLine("完成");
|
||||
|
||||
// 指针指向格式化后的
|
||||
nodeList = fNodeList;
|
||||
}
|
||||
|
||||
|
||||
// 层级
|
||||
int tier = 0;
|
||||
// 查找孩子并进行分层
|
||||
private void findChildren(Node node, List<Node> fNodeList)
|
||||
{
|
||||
// 当前层 默认第一级,根在外层进行操作
|
||||
tier++;
|
||||
|
||||
for (int i = 0; i < nodeList.Count; i++)
|
||||
{
|
||||
Node item = nodeList[i];
|
||||
if (item.parent == node)
|
||||
{
|
||||
item.tier = tier;
|
||||
fNodeList.Add(item);
|
||||
findChildren(item, fNodeList);
|
||||
}
|
||||
}
|
||||
|
||||
// 走出一层
|
||||
tier--;
|
||||
}
|
||||
|
||||
//查找前缀空格数量
|
||||
private int findPreSpace(String str)
|
||||
{
|
||||
List<char> chars = str.ToList();
|
||||
int count = 0;
|
||||
foreach (char c in chars)
|
||||
{
|
||||
if (c == ' ')
|
||||
{
|
||||
count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
// 根据缩进找上级
|
||||
private Node findParent(int space)
|
||||
{
|
||||
|
||||
if (nodeList.Count == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 倒着找上级
|
||||
for (int i = nodeList.Count - 1; i >= 0; i--)
|
||||
{
|
||||
Node node = nodeList[i];
|
||||
if (node.space < space)
|
||||
{
|
||||
return node;
|
||||
}
|
||||
}
|
||||
// 如果没有找到 返回null
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// 私有节点类
|
||||
private class Node
|
||||
{
|
||||
// 名称
|
||||
public String name { get; set; }
|
||||
// 值
|
||||
public String value { get; set; }
|
||||
// 父级
|
||||
public Node parent { get; set; }
|
||||
// 前缀空格
|
||||
public int space { get; set; }
|
||||
// 所属层级
|
||||
public int tier { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user