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