Files
ShrlAlgoToolkit/RevitLess/BasicFileInfo.cs
ShrlAlgo 4d35cadb56 更新
2025-07-11 09:20:23 +08:00

432 lines
9.3 KiB
C#

using System;
using System.Diagnostics;
using System.IO;
using System.IO.Packaging;
using System.Text;
namespace RevitLess
{
public class BasicFileInfo : StorageStreamBase
{
#region Private Variables
private WorkSharingMode _workSharing = WorkSharingMode.Unknown;
private string _userName = string.Empty;
private string _centralFilePath = string.Empty;
private string _revitBuild = string.Empty;
private string _lastSavedpath = string.Empty;
private int _openWorksetDefault = 0;
#endregion
#region Constructors
public BasicFileInfo(string fileName, StorageInfo storage)
: base(fileName, storage)
{
ReadStructuredStorageFile();
}
#endregion
#region Public Properties
public bool IsCentralFile
{
get
{
if((WorkSharing == WorkSharingMode.NotEnabled) ||
(WorkSharing == WorkSharingMode.Unknown))
{
return false;
}
bool fileNamesMatch = false;
bool workSharing = WorkSharing == WorkSharingMode.Central;
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;
}
}
public bool IsLocalWorkingFile
{
get
{
if((WorkSharing == WorkSharingMode.NotEnabled) ||
(WorkSharing == WorkSharingMode.Unknown))
{
return false;
}
bool fileNamesMatch = false;
bool workSharing = WorkSharing == WorkSharingMode.Local;
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);
}
}
public WorkSharingMode WorkSharing
{
get
{
return _workSharing;
}
private set
{
_workSharing = value;
}
}
public string UserName
{
get
{
return _userName;
}
private set
{
_userName = value;
}
}
public string CentralFilePath
{
get
{
return _centralFilePath;
}
private set
{
_centralFilePath = value;
}
}
public string RevitBuild
{
get
{
return _revitBuild;
}
private set
{
_revitBuild = value;
}
}
public ProductType Product
{
get
{
if(string.IsNullOrEmpty(RevitBuild))
{
return ProductType.Unknown;
}
if(RevitBuild.ToUpper().IndexOf("MEP") >= 0)
{
return ProductType.MEP;
}
if(RevitBuild.ToUpper().IndexOf("ARCHITECTURE") >= 0)
{
return ProductType.Architecture;
}
if(RevitBuild.ToUpper().IndexOf("STRUCTURE") >= 0)
{
return ProductType.Structure;
}
return ProductType.Unknown;
}
}
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();
}
}
public PlatformType Platform
{
get
{
if(string.IsNullOrEmpty(RevitBuild))
{
return PlatformType.Unknown;
}
if(RevitBuild.ToUpper().IndexOf("X64") >= 0)
{
return PlatformType.x64;
}
return PlatformType.x86;
}
}
public string LastSavedpath
{
get
{
return _lastSavedpath;
}
private set
{
_lastSavedpath = value;
}
}
public int OpenWorksetDefault
{
get
{
return _openWorksetDefault;
}
private set
{
_openWorksetDefault = value;
}
}
#endregion
#region Private Properties
#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);
detailKey = StringUtility.PurgeUnprintableCharacters(detailKey);
detailValue = StringUtility.PurgeUnprintableCharacters(detailValue);
switch(detailKey)
{
case "WORKSHARING":
if(string.IsNullOrEmpty(detailValue))
{
WorkSharing = WorkSharingMode.Unknown;
return;
}
string workSharing = detailValue.Replace(" ", string.Empty).Trim().ToUpper();
switch(workSharing)
{
case "NOTENABLED":
WorkSharing = WorkSharingMode.NotEnabled;
break;
case "LOCAL":
WorkSharing = WorkSharingMode.Local;
break;
case "CENTRAL":
WorkSharing = WorkSharingMode.Central;
break;
default:
WorkSharing = WorkSharingMode.Unknown;
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"))
{
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)
{
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
}
}