使用Forge Design Automation API时无法打开Zip文件的权限问题求助
解决Forge Design Automation API Zip文件权限访问问题
问题核心原因
你在Activity的inputZip参数中设置了"zip": true,Forge Design Automation服务会自动将指定URL的Zip文件下载并解压到工作目录,不会保留原始的test.zip文件。你的代码尝试打开不存在的.\test.zip文件,因此触发了权限拒绝错误(本质是文件不存在导致的路径访问异常)。
解决方案1:利用DA自动解压(推荐)
保持Activity参数的"zip": true配置,DA会自动将Zip内的文件解压到工作目录,无需手动处理解压流程,直接访问解压后的文件即可:
string currentDir = Environment.CurrentDirectory; string familyFullPath = null; // 遍历工作目录查找.rfa族文件 foreach (string file in Directory.GetFiles(currentDir, "*.rfa", SearchOption.AllDirectories)) { familyFullPath = file; Console.WriteLine("找到族文件:" + familyFullPath); break; // 按需调整,比如取第一个匹配的文件 } // 加载族文件 if (!string.IsNullOrEmpty(familyFullPath)) { using (var document = new Autodesk.Revit.DB.Document()) { if (document.LoadFamily(familyFullPath, out Family family)) { Console.WriteLine("成功加载族:" + family.Name); } else { Console.WriteLine("加载族失败"); } } }
解决方案2:手动处理Zip文件
如果你需要自己控制解压流程,修改Activity参数去掉"zip": true,让DA直接下载原始Zip文件,然后用绝对路径访问并解压:
步骤1:修改Activity参数
"inputZip": { "verb": "get", "description": "input file", "localName": "test.zip", "ondemand": false, "required": false // 移除"zip": true配置 }
步骤2:修改代码逻辑
string destinationPath = null; string currentDir = Environment.CurrentDirectory; // 使用绝对路径访问Zip文件,避免相对路径出错 string zipFilePath = Path.Combine(currentDir, "test.zip"); // 先检查Zip文件是否存在 if (!File.Exists(zipFilePath)) { Console.WriteLine("未找到Zip文件:" + zipFilePath); return; } using (ZipArchive zip = ZipFile.Open(zipFilePath, ZipArchiveMode.Read)) { foreach (ZipArchiveEntry entry in zip.Entries) { // 跳过目录项 if (string.IsNullOrEmpty(entry.Name)) continue; if (entry.FullName.EndsWith(".rfa", StringComparison.OrdinalIgnoreCase)) { string targetPath = Path.Combine(currentDir, entry.FullName); // 确保目标目录存在 Directory.CreateDirectory(Path.GetDirectoryName(targetPath)); // 提取文件(允许覆盖已存在文件) entry.ExtractToFile(targetPath, overwrite: true); destinationPath = targetPath; Console.WriteLine("已提取文件:" + destinationPath); } } } // 加载族文件 if (!string.IsNullOrEmpty(destinationPath)) { using (var document = new Autodesk.Revit.DB.Document()) { if (document.LoadFamily(destinationPath, out Family family)) { Console.WriteLine("成功加载族:" + family.Name); } else { Console.WriteLine("加载族失败"); } } }
关键注意事项
- 所有文件操作必须在DA的工作目录(
Environment.CurrentDirectory)下进行,禁止访问系统其他路径,否则会触发权限错误。 - 手动解压时,务必先创建目标文件的父目录,避免因目录不存在导致解压失败。
- 确保WebSocket参数中的Zip文件URL可被DA服务访问(如使用带签名的临时URL或公开可访问的URL)。
内容的提问来源于stack exchange,提问作者codeFreak24
相关产品推荐
相关产品推荐

