cad.net 关于保存文件Database.SaveAs()出现"eFileAccessErr"错误的解决方法

非后台情况时,在cad使用保存函数db.Save(),无论如何都会出错.

但是当使用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);    //还是这种
                }
            }
        }

但是文档上面也有一个保存函数,这个倒是成功的...不过就是会关闭文档罢了.

e大说:文档和db是分开的对象,文档占用了文件,db无法覆盖,所以用文档的 CloseAndSave 可以成功(因为桌子在内部做了工作...)

        [CommandMethod("save_test2", CommandFlags.Session)]
        public void save_test2()
        {
            foreach (Document item in Acap.DocumentManager)
            { 
                item.CloseAndSave(item.Database.Filename); 
            }
        }

但是我程序处理保存的时候要同时处理三种状态: 1,前台打开(激活的) 2,前台打开(未激活) 3,后台打开的

同时,我不调用令人讨厌的Document.CloseAndSave

福萝卜提示发送命令.

        using Acap = Autodesk.AutoCAD.ApplicationServices.Application;
private static void TiJiao(Database db) { bool flag = true; foreach (Document doc in Acap.DocumentManager) { if (doc.Database.Filename == db.Filename)//文档是当前打开的 { doc.SendStringToExecute("_qsave ", false, true, true); //不需要切换文档 flag = false; break; } } if (flag) { //后台的数据库可以用这种方式保存 db.SaveAs(db.Filename, db.SecurityParameters); } }

嘻嘻.感谢e大和福萝卜.

原文地址:https://www.cnblogs.com/JJBox/p/12156778.html