在Revit API中,我知道可以获取当前运行的Revit实例的版本(ControlledApplication.VersionBuild
、ControlledApplication.VersionName
、ControlledApplication.VersionNumber
)。但是,我希望在打开Revit文件之前获取该文件本身的版本。这样,我就可以停止当用户在较新版本的Revit中打开较旧的Revit文件时显示的自动升级对话框。我正在使用Revit 2013,并期望2011年、2012年和2013年的文件。
发布于 2013-01-24 11:30:16
如您所说,Revit文件格式是结构化存储文档,所需信息存储在BasicFileInfo流中。
Here是演示如何提取BasicFileInfo数据的完整控制台应用程序
不幸的是,我不知道BasicFileInfoStream的格式。但是,如果您将其作为字符串读取,则可以获得创建文件的版本。
读取唯一的BasicFileInfo比读取整个文件要好得多。想象一下,如果Revit项目超过500 MB或更多。当你调用
string fileContents = streamReader.ReadToEnd();
您将整个文件写入内存。
此外,大文件上的正则表达式运行速度很慢。
我觉得你应该用
var rawString = System.Text.Encoding.Unicode.GetString(rawData);
并在rawString中使用正则表达式,而不是整个文件。
希望能有所帮助。
更新:我完全忘记了。在Revit 2013中,可以使用BasicFileInfo
类的SavedInCurrentVersion
属性来确定文件是否保存在当前版本的Revit中。如果您想要获取保存文件的版本(如问题标题中所示),您可以使用同一个类的SavedInVersion
属性。您可以使用BasicFileInfo.Extract
方法来获取BasicFileInfo
。
发布于 2013-01-24 03:32:11
我仔细查看了问题中的discussion group posting,发现在文件的其他乱码中,版本信息实际上是人类可读的。".rvt“文件是以OLE格式存储的,所以如果使用像Structured Storage Viewer这样的工具,你可以看到它的内容。它将位于BasicFileInfo下。
如果您愿意,您可以使用OLE library for .NET读取数据,但我使用了StreamReader
和Regex
。
下面是正则表达式:
Revit\sArchitecture\s(?\d{4})\s(Build:\s(?\w*)((?\w{3})))
代码如下:
private void ControlledApplication_DocumentOpening (object sender,
DocumentOpeningEventArgs e)
{
FileInfo revitFileToUpgrade = new FileInfo(e.PathName);
Regex buildInfoRegex = new Regex(
@"Revit\sArchitecture\s(?<Year>\d{4})\s\(Build:\s(?<Build>\w*)\((<Processor>\w{3})\)\)");
using(StreamReader streamReader =
new StreamReader(e.PathName, Encoding.Unicode))
{
string fileContents = streamReader.ReadToEnd();
Match buildInfo = buildInfoRegex.Match(fileContents);
string year = buildInfo.Groups["Year"].Value;
string build = buildInfo.Groups["Build"].Value;
string processor = buildInfo.Groups["Processor"].Value;
}
}
这将允许您获取年份、内部版本号和处理器类型。但是,请注意,我的版本专门针对Architecture进行检查,因此您需要针对MEP或Structural对其进行修改。
更新了:
https://stackoverflow.com/questions/14481652
复制相似问题