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:保存并关闭文档

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

跟e大讨论了之后,发现这要从cad程序架构来看,
文档doc和数据库db是分开的对象,db在doc下,doc占用了文件,db无法覆盖操作,所以用文档的 Document.CloseAndSave() 可以成功(因为桌子在内部做了工作...)

[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;        

private static void TestSaveDwgFiles(Database db)
{
    bool flag = true;
    foreach (Document doc in Acap.DocumentManager)
    {
        // 前台开图,使用命令保存
        if (doc.Database.Filename == db.Filename)
        {
            doc.SendStringToExecute("_qsave\n", false, true, true); //不需要切换文档
            flag = false;
            break;
        }
    }
    if (flag)
    { 
        // 后台开图,用数据库保存
        db.SaveAs(db.Filename, db.SecurityParameters); 
    }
}

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

相关阅读

cad.net 委托的学习 -->需求2: 批量输入路径提取数据库


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM