使用C# API开发SolidWorks插件加载SAT文件时LoadFile4调用失败(状态码1)
解决SolidWorks插件LoadFile4加载SAT返回状态码1的问题
针对你用LoadFile4加载SAT文件返回状态码1(无法读取文件)的问题,结合你的代码片段,整理几个关键排查和修复点:
临时文件未完全写入就操作:
你的代码中复制流到文件后直接调用SolidWorks API读取,但wfileStream还未完成写入和释放,文件流缓存可能未同步到磁盘,导致SolidWorks读取到不完整的SAT文件。
修正方式:把wfileStream也放进using块自动释放,确保文件写入完成后再执行导入:using (Stream rStream = zipFileSystem.OpenFile(file, FileAccess.Read)) using (var wfileStream = File.Create(fileNameToWorkOn)) { rStream.CopyTo(wfileStream); } // 自动释放流,保证文件写入完整 // 之后再执行SAT导入操作错误提前打开不存在的SLDPRT文件:
代码中先调用OpenDoc6打开一个尚未生成的.SLDPRT文件,这不仅无意义,还可能干扰后续LoadFile4的正常执行。LoadFile4本身可以直接加载SAT并创建新零件文档,无需提前打开空零件,直接移除这行代码即可。导入数据类型不匹配:
SAT文件对应的导入数据类型是ImportSATData,而非Import3DInterconnectData(后者用于3D互连格式导入),错误的类型会导致导入参数无效:// 替换原ImportData获取代码 ImportSATData importData = (ImportSATData)mSldWorksApplication.GetImportFileData(fileNameToWorkOn);路径与权限检查:
- 确认
D:\temp目录有读写权限,避免SolidWorks无法读取临时文件 - 用
EndsWith(".SAT")替代Contains(".SAT")判断文件类型,避免文件名中间包含.SAT的误判 - 检查
file.EntityName是否包含特殊字符或多余路径,确保拼接后的fileNameToWorkOn是合法完整路径
- 确认
修正后的核心代码片段参考:
foreach (var file in ListOfFiles) { if (file.EntityName.ToUpper().EndsWith(".SAT")) { string fileNameToWorkOn = @"d:\temp\" + file.EntityName; // 完整写入临时文件 using (Stream rStream = zipFileSystem.OpenFile(file, FileAccess.Read)) using (var wfileStream = File.Create(fileNameToWorkOn)) { rStream.CopyTo(wfileStream); } // 获取正确的SAT导入数据 ImportSATData importData = (ImportSATData)mSldWorksApplication.GetImportFileData(fileNameToWorkOn); if (importData == null) { File.Delete(fileNameToWorkOn); continue; } // 加载SAT文件 long status = 0; PartDoc swPart = (PartDoc)mSldWorksApplication.LoadFile4(fileNameToWorkOn, "r", importData, ref status); if (status == 0 && swPart != null) { ModelDoc2 swModel = (ModelDoc2)swPart; string fileNameToCreate = fileNameToWorkOn.ToUpper().Replace(".SAT", ".SLDPRT"); // 保存为SLDPRT格式 swModel.SaveAs4(fileNameToCreate, (int)swSaveAsVersion_e.swSaveAsCurrentVersion, (int)swSaveAsOptions_e.swSaveAsOptions_Silent, null); // 关闭文档 mSldWorksApplication.CloseDoc(fileNameToCreate); } // 清理临时文件 File.Delete(fileNameToWorkOn); } }
内容的提问来源于stack exchange,提问作者Poterie UN PETIT TOUR DE TERRE
相关产品推荐
相关产品推荐

