2025-07-11 09:20:23 +08:00
|
|
|
|
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
|
using System.IO;
|
|
|
|
|
|
using System.IO.Packaging;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
2026-02-12 21:29:00 +08:00
|
|
|
|
using RevitLess;
|
|
|
|
|
|
|
|
|
|
|
|
namespace ShrlAlgoStudio.RevitLess
|
2025-07-11 09:20:23 +08:00
|
|
|
|
{
|
|
|
|
|
|
|
2026-02-12 21:29:00 +08:00
|
|
|
|
public class BasicFileInfo : RevitLess.StorageStreamBase
|
2025-07-11 09:20:23 +08:00
|
|
|
|
{
|
|
|
|
|
|
|
2026-01-02 16:37:37 +08:00
|
|
|
|
#region Private Variables
|
2025-07-11 09:20:23 +08:00
|
|
|
|
|
2026-02-12 21:29:00 +08:00
|
|
|
|
private RevitLess.WorkSharingMode workSharing = RevitLess.WorkSharingMode.Unknown;
|
2026-01-02 16:37:37 +08:00
|
|
|
|
private string userName = string.Empty;
|
|
|
|
|
|
private string centralFilePath = string.Empty;
|
|
|
|
|
|
private string revitBuild = string.Empty;
|
|
|
|
|
|
private string lastSavedpath = string.Empty;
|
|
|
|
|
|
private int openWorksetDefault = 0;
|
2025-07-11 09:20:23 +08:00
|
|
|
|
|
2026-01-02 16:37:37 +08:00
|
|
|
|
#endregion
|
2025-07-11 09:20:23 +08:00
|
|
|
|
|
2026-01-02 16:37:37 +08:00
|
|
|
|
#region Constructors
|
2025-07-11 09:20:23 +08:00
|
|
|
|
|
2026-01-02 16:37:37 +08:00
|
|
|
|
public BasicFileInfo(string fileName, StorageInfo storage)
|
|
|
|
|
|
: base(fileName, storage)
|
|
|
|
|
|
{
|
|
|
|
|
|
ReadStructuredStorageFile();
|
|
|
|
|
|
}
|
2025-07-11 09:20:23 +08:00
|
|
|
|
|
2026-01-02 16:37:37 +08:00
|
|
|
|
#endregion
|
2025-07-11 09:20:23 +08:00
|
|
|
|
|
2026-01-02 16:37:37 +08:00
|
|
|
|
#region Public Properties
|
2025-07-11 09:20:23 +08:00
|
|
|
|
|
2026-01-02 16:37:37 +08:00
|
|
|
|
public bool IsCentralFile
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
2026-02-12 21:29:00 +08:00
|
|
|
|
if ((WorkSharing == RevitLess.WorkSharingMode.NotEnabled) ||
|
|
|
|
|
|
(WorkSharing == RevitLess.WorkSharingMode.Unknown))
|
2026-01-02 16:37:37 +08:00
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
bool fileNamesMatch = false;
|
2026-02-12 21:29:00 +08:00
|
|
|
|
bool workSharing = WorkSharing == RevitLess.WorkSharingMode.Central;
|
2026-01-02 16:37:37 +08:00
|
|
|
|
string fileName = Path.GetFileName(FileName).ToUpper();
|
|
|
|
|
|
string centralFile = string.Empty;
|
|
|
|
|
|
if (CentralFilePath.Length > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
centralFile = Path.GetFileName(CentralFilePath).ToUpper();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (centralFile.Length > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
fileNamesMatch = centralFile.Equals(fileName);
|
|
|
|
|
|
}
|
|
|
|
|
|
return workSharing && fileNamesMatch;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-07-11 09:20:23 +08:00
|
|
|
|
|
2026-01-02 16:37:37 +08:00
|
|
|
|
public bool IsLocalWorkingFile
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
2026-02-12 21:29:00 +08:00
|
|
|
|
if ((WorkSharing == RevitLess.WorkSharingMode.NotEnabled) ||
|
|
|
|
|
|
(WorkSharing == RevitLess.WorkSharingMode.Unknown))
|
2026-01-02 16:37:37 +08:00
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
bool fileNamesMatch = false;
|
2026-02-12 21:29:00 +08:00
|
|
|
|
bool workSharing = WorkSharing == RevitLess.WorkSharingMode.Local;
|
2026-01-02 16:37:37 +08:00
|
|
|
|
string fileName = Path.GetFileName(FileName).ToUpper();
|
|
|
|
|
|
string centralFile = string.Empty;
|
|
|
|
|
|
if (CentralFilePath.Length > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
centralFile = Path.GetFileName(CentralFilePath).ToUpper();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (centralFile.Length > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
fileNamesMatch = centralFile.Equals(fileName);
|
|
|
|
|
|
}
|
|
|
|
|
|
return workSharing || (fileNamesMatch == false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-07-11 09:20:23 +08:00
|
|
|
|
|
2026-02-12 21:29:00 +08:00
|
|
|
|
public RevitLess.WorkSharingMode WorkSharing
|
2026-01-02 16:37:37 +08:00
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return workSharing;
|
|
|
|
|
|
}
|
|
|
|
|
|
private set
|
|
|
|
|
|
{
|
|
|
|
|
|
workSharing = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-07-11 09:20:23 +08:00
|
|
|
|
|
2026-01-02 16:37:37 +08:00
|
|
|
|
public string UserName
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return userName;
|
|
|
|
|
|
}
|
|
|
|
|
|
private set
|
|
|
|
|
|
{
|
|
|
|
|
|
userName = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-07-11 09:20:23 +08:00
|
|
|
|
|
2026-01-02 16:37:37 +08:00
|
|
|
|
public string CentralFilePath
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return centralFilePath;
|
|
|
|
|
|
}
|
|
|
|
|
|
private set
|
|
|
|
|
|
{
|
|
|
|
|
|
centralFilePath = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-07-11 09:20:23 +08:00
|
|
|
|
|
2026-01-02 16:37:37 +08:00
|
|
|
|
public string RevitBuild
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return revitBuild;
|
|
|
|
|
|
}
|
|
|
|
|
|
private set
|
|
|
|
|
|
{
|
|
|
|
|
|
revitBuild = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-07-11 09:20:23 +08:00
|
|
|
|
|
2026-02-12 21:29:00 +08:00
|
|
|
|
public RevitLess.ProductType Product
|
2026-01-02 16:37:37 +08:00
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
if (string.IsNullOrEmpty(RevitBuild))
|
|
|
|
|
|
{
|
2026-02-12 21:29:00 +08:00
|
|
|
|
return RevitLess.ProductType.Unknown;
|
2026-01-02 16:37:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (RevitBuild.ToUpper().IndexOf("MEP") >= 0)
|
|
|
|
|
|
{
|
2026-02-12 21:29:00 +08:00
|
|
|
|
return RevitLess.ProductType.MEP;
|
2026-01-02 16:37:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (RevitBuild.ToUpper().IndexOf("ARCHITECTURE") >= 0)
|
|
|
|
|
|
{
|
2026-02-12 21:29:00 +08:00
|
|
|
|
return RevitLess.ProductType.Architecture;
|
2026-01-02 16:37:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (RevitBuild.ToUpper().IndexOf("STRUCTURE") >= 0)
|
|
|
|
|
|
{
|
2026-02-12 21:29:00 +08:00
|
|
|
|
return RevitLess.ProductType.Structure;
|
2026-01-02 16:37:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-12 21:29:00 +08:00
|
|
|
|
return RevitLess.ProductType.Unknown;
|
2026-01-02 16:37:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-07-11 09:20:23 +08:00
|
|
|
|
|
2026-01-02 16:37:37 +08:00
|
|
|
|
public string BuildTimeStamp
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
if (string.IsNullOrEmpty(RevitBuild))
|
|
|
|
|
|
{
|
|
|
|
|
|
return string.Empty;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string[] buildParts = RevitBuild.Split(new char[] { ':' });
|
|
|
|
|
|
if (buildParts != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (buildParts.Length == 2)
|
|
|
|
|
|
{
|
|
|
|
|
|
string timeStamp = buildParts[1].Trim().Replace("(x64))", string.Empty);
|
|
|
|
|
|
timeStamp = timeStamp.Replace("(x64)", string.Empty);
|
|
|
|
|
|
timeStamp = timeStamp.Replace(")", string.Empty);
|
|
|
|
|
|
return timeStamp.Trim();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return revitBuild.Trim();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-07-11 09:20:23 +08:00
|
|
|
|
|
2026-01-02 16:37:37 +08:00
|
|
|
|
public PlatformType Platform
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
if (string.IsNullOrEmpty(RevitBuild))
|
|
|
|
|
|
{
|
|
|
|
|
|
return PlatformType.Unknown;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (RevitBuild.ToUpper().IndexOf("X64") >= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
return PlatformType.X64;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return PlatformType.X86;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-07-11 09:20:23 +08:00
|
|
|
|
|
2026-01-02 16:37:37 +08:00
|
|
|
|
public string LastSavedpath
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return lastSavedpath;
|
|
|
|
|
|
}
|
|
|
|
|
|
private set
|
|
|
|
|
|
{
|
|
|
|
|
|
lastSavedpath = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-07-11 09:20:23 +08:00
|
|
|
|
|
2026-01-02 16:37:37 +08:00
|
|
|
|
public int OpenWorksetDefault
|
2025-07-11 09:20:23 +08:00
|
|
|
|
{
|
2026-01-02 16:37:37 +08:00
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return openWorksetDefault;
|
|
|
|
|
|
}
|
|
|
|
|
|
private set
|
|
|
|
|
|
{
|
|
|
|
|
|
openWorksetDefault = value;
|
|
|
|
|
|
}
|
2025-07-11 09:20:23 +08:00
|
|
|
|
}
|
2026-01-02 16:37:37 +08:00
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region Public Methods
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region Private Methods
|
|
|
|
|
|
|
|
|
|
|
|
private void ParseDetailInfo(string detailInfo)
|
|
|
|
|
|
{
|
|
|
|
|
|
detailInfo = detailInfo.Trim();
|
|
|
|
|
|
int index = detailInfo.IndexOf(":");
|
|
|
|
|
|
string detailValue = detailInfo.Substring(detailInfo.IndexOf(":") + 1);
|
|
|
|
|
|
string detailKey = detailInfo.Substring(0, detailInfo.IndexOf(":"));
|
|
|
|
|
|
detailKey = detailKey.Trim().ToUpper().Replace(" ", string.Empty);
|
2026-02-12 21:29:00 +08:00
|
|
|
|
detailKey = RevitLess.StringUtility.PurgeUnprintableCharacters(detailKey);
|
|
|
|
|
|
detailValue = RevitLess.StringUtility.PurgeUnprintableCharacters(detailValue);
|
2026-01-02 16:37:37 +08:00
|
|
|
|
|
|
|
|
|
|
switch (detailKey)
|
|
|
|
|
|
{
|
|
|
|
|
|
case "WORKSHARING":
|
|
|
|
|
|
if (string.IsNullOrEmpty(detailValue))
|
|
|
|
|
|
{
|
2026-02-12 21:29:00 +08:00
|
|
|
|
WorkSharing = RevitLess.WorkSharingMode.Unknown;
|
2026-01-02 16:37:37 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string workSharing = detailValue.Replace(" ", string.Empty).Trim().ToUpper();
|
|
|
|
|
|
switch (workSharing)
|
|
|
|
|
|
{
|
|
|
|
|
|
case "NOTENABLED":
|
2026-02-12 21:29:00 +08:00
|
|
|
|
WorkSharing = RevitLess.WorkSharingMode.NotEnabled;
|
2026-01-02 16:37:37 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "LOCAL":
|
2026-02-12 21:29:00 +08:00
|
|
|
|
WorkSharing = RevitLess.WorkSharingMode.Local;
|
2026-01-02 16:37:37 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "CENTRAL":
|
2026-02-12 21:29:00 +08:00
|
|
|
|
WorkSharing = RevitLess.WorkSharingMode.Central;
|
2026-01-02 16:37:37 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
2026-02-12 21:29:00 +08:00
|
|
|
|
WorkSharing = RevitLess.WorkSharingMode.Unknown;
|
2026-01-02 16:37:37 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "USERNAME":
|
|
|
|
|
|
UserName = detailValue.Trim();
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "CENTRALFILEPATH":
|
|
|
|
|
|
CentralFilePath = detailValue.Trim();
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "REVITBUILD":
|
|
|
|
|
|
RevitBuild = detailValue.Trim();
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "LASTSAVEPATH":
|
|
|
|
|
|
LastSavedpath = detailValue.Trim();
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "OPENWORKSETDEFAULT":
|
|
|
|
|
|
OpenWorksetDefault = Convert.ToInt32(detailValue.Trim());
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
//Debug.Assert(false, string.Format("{0} was not found in the case tests.", detailKey));
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region Protected Methods
|
|
|
|
|
|
|
|
|
|
|
|
//internal override void ReadStructuredStorageFile()
|
|
|
|
|
|
//{
|
|
|
|
|
|
// if(IsInitialized)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// return;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// try
|
|
|
|
|
|
// {
|
|
|
|
|
|
// StreamInfo[] streams = Storage.GetStreams();
|
|
|
|
|
|
// foreach(StreamInfo stream in streams)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// if(stream.Name.ToUpper().Equals("BASICFILEINFO"))
|
|
|
|
|
|
// {
|
|
|
|
|
|
// string unicodeData = StringUtility.ConvertStreamBytesToUnicode(stream);
|
|
|
|
|
|
// string[] basicFileInfoParts = unicodeData.Split(new char[] { '\0' });
|
|
|
|
|
|
|
|
|
|
|
|
// foreach(string basicFileInfoPart in basicFileInfoParts)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// if(basicFileInfoPart.IndexOf("\r\n") >= 0)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// string[] detailInfoParts = basicFileInfoPart.Split(new string[] { "\r\n" }, new StringSplitOptions());
|
|
|
|
|
|
// foreach(string detailPart in detailInfoParts)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// ParseDetailInfo(detailPart);
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// catch(Exception ex)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// LogManager.LogMessage(ex);
|
|
|
|
|
|
// IsInitialized = false;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// IsInitialized = true;
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
public void ReadStructuredStorageFile()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (IsInitialized)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
StreamInfo[] streams = Storage.GetStreams();
|
|
|
|
|
|
foreach (StreamInfo stream in streams)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (stream.Name.ToUpper().Equals("BASICFILEINFO"))
|
|
|
|
|
|
{
|
2026-02-12 21:29:00 +08:00
|
|
|
|
string unicodeData = RevitLess.StringUtility.ConvertStreamBytesToUnicode(stream);
|
2026-01-02 16:37:37 +08:00
|
|
|
|
string[] basicFileInfoParts = unicodeData.Split(new char[] { '\0' });
|
|
|
|
|
|
|
|
|
|
|
|
foreach (string basicFileInfoPart in basicFileInfoParts)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (basicFileInfoPart.IndexOf("\r\n") >= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
string[] detailInfoParts = basicFileInfoPart.Split(new string[] { "\r\n" }, new StringSplitOptions());
|
|
|
|
|
|
foreach (string detailPart in detailInfoParts)
|
|
|
|
|
|
{
|
|
|
|
|
|
ParseDetailInfo(detailPart);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.WriteLine(ex.Message);
|
|
|
|
|
|
IsInitialized = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
IsInitialized = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override string ToString()
|
|
|
|
|
|
{
|
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
|
|
string seperator = string.Empty;
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
if (this != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
seperator = "+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+" + Environment.NewLine;
|
|
|
|
|
|
sb.Append(string.Format("FileName: <{0}>{1}", FileName, Environment.NewLine));
|
|
|
|
|
|
sb.Append(seperator);
|
|
|
|
|
|
sb.Append(string.Format("BasicFileInfo Section{0}", Environment.NewLine));
|
|
|
|
|
|
sb.Append(seperator);
|
|
|
|
|
|
sb.Append(string.Format("DocType: <{0}>{1}", DocType, Environment.NewLine));
|
|
|
|
|
|
sb.Append(string.Format("WorkSharing: <{0}>{1}", WorkSharing, Environment.NewLine));
|
|
|
|
|
|
sb.Append(string.Format("IsCentralFile: <{0}>{1}", IsCentralFile, Environment.NewLine));
|
|
|
|
|
|
sb.Append(string.Format("UserName: <{0}>{1}", UserName, Environment.NewLine));
|
|
|
|
|
|
sb.Append(string.Format("CentralFilePath: <{0}>{1}", CentralFilePath, Environment.NewLine));
|
|
|
|
|
|
sb.Append(string.Format("RevitBuild: <{0}>{1}", RevitBuild, Environment.NewLine));
|
|
|
|
|
|
sb.Append(string.Format("Product: <{0}>{1}", Product, Environment.NewLine));
|
|
|
|
|
|
sb.Append(string.Format("Platform: <{0}>{1}", Platform, Environment.NewLine));
|
|
|
|
|
|
sb.Append(string.Format("BuildTimeStamp: <{0}>{1}", BuildTimeStamp, Environment.NewLine));
|
|
|
|
|
|
sb.Append(string.Format("LastSavedpath: <{0}>{1}", LastSavedpath, Environment.NewLine));
|
|
|
|
|
|
sb.Append(string.Format("OpenWorksetDefault: <{0}>{1}", OpenWorksetDefault, Environment.NewLine));
|
|
|
|
|
|
sb.Append(seperator);
|
|
|
|
|
|
seperator = sb.ToString();
|
|
|
|
|
|
return seperator;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
finally
|
|
|
|
|
|
{
|
|
|
|
|
|
sb.Length = 0;
|
|
|
|
|
|
sb.Capacity = 0;
|
|
|
|
|
|
sb = null;
|
|
|
|
|
|
}
|
|
|
|
|
|
return string.Empty;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
2025-07-11 09:20:23 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|