cad.net 关于保存文件Database.SaveAs()出现eFileAccessErr错误的解决方法
前台开启dwg保存方法出错
出错例子
前台打开
图纸的时候(后台不会),使用保存函数db.Save()
,无论如何都会出错.
但是当使用db.SaveAs()
时,除了调用被命令的文档之外,其他文档都会抛出错误eFileAccessErr
可以从下面这个例子了解到:
[CommandMethod("save_test1", CommandFlags.Session)]
public void save_test1() {
foreach (Document doc in Acap.DocumentManager) {
// 当打开多份图纸的时候,用db.SaveAs都是会出错的.
var db = doc.Database;
// using (doc.LockDocument()) // 无论是否使用文档锁
{
// db.SaveAs(db.Filename, db.SecurityParameters); // 无论是这种
db.SaveAs(db.Filename, DwgVersion.Current); // 还是这种
}
}
}
保存成功的例子1:保存并关闭文档
文档上面也有一个保存函数Document.CloseAndSave()
,
这个倒是成功的,不过就是会关闭文档罢了.
跟e大讨论了之后,发现这要从cad程序架构来看,
文档doc和数据库db是分开的对象.
前台打开时候doc会占用db,所以不能直接操作db了,
所以用文档的函数可以成功.
而后台打开时候就没有doc占用,就能直接用db的保存.
using Acap = Autodesk.AutoCAD.ApplicationServices.Application;
[CommandMethod("save_test2", CommandFlags.Session)]
public void save_test2() {
foreach (Document item in Acap.DocumentManager) {
item.CloseAndSave(item.Database.Filename);
}
}
保存成功的例子2:处理三种状态
但是我程序处理保存的时候要同时处理
三种状态: 1,前台打开(激活的) 2,前台打开(未激活) 3,后台打开的
同时,我不调用令人讨厌的 Document.CloseAndSave()
,
福萝卜提示我用发送命令.
using Acap = Autodesk.AutoCAD.ApplicationServices.Application;
public static void MySave(this Database db) {
var doc = Acap.DocumentManager
.Cast<Document>
.FirstOrDefault(doc => doc.Database.Filename == db.Filename);
if (doc is null) {
// 后台开图,用数据库保存
db.SaveAs(db.Filename, db.SecurityParameters);
}
else {
// 文档存在,表示前台开图,使用命令保存
// 不需要切换文档
doc.SendStringToExecute("_qsave\n", false, true, true);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)