1、說明
在使用ArcGIS桌面產品的時候,有時會碰到這樣的情況:同時在ArcCatalog和ArcMap中瀏覽圖層數據,然后在ArcMap中remove掉圖層,再回到ArcCatalog中刪除該圖層,卻得到該圖層被鎖的信息。非得關掉ArcMap才能正常刪除。同樣的情況也會在ArcEngine開發的應用程序中碰到。可有時候會有這樣需要,在不關閉ArcEngine應用程序的情況下,對圖層數據做相應的操作,如將圖層數據壓縮打包。對這個問題ArcEngine提供了相應的接口控制,只是我們很少去關注而已。
2、解鎖資源文件
解除對資源文件的鎖定需要使用IWorkspaceFactoryLockControl接口,默認情況下對資源文件的鎖定狀態是打開的,可通過如下的方式得知:
ipWsFactoryLock.SchemaLockingEnabled
解鎖資源文件的一般步驟:使用IWorkspaceFactoryLockControl接口關閉資源鎖定,然后在使用完AE COM接口后,使用ComRelease釋放COM接口即可。示例源碼如下:
private void mnuItemUnlockFGDB_Click(object sender, EventArgs e)
{
IWorkspaceFactory2 ipWsFactory = new FileGDBWorkspaceFactoryClass();
//關閉資源鎖定
IWorkspaceFactoryLockControl ipWsFactoryLock;
ipWsFactoryLock = (IWorkspaceFactoryLockControl)ipWsFactory;
if (ipWsFactoryLock.SchemaLockingEnabled)
{
ipWsFactoryLock.DisableSchemaLocking();
}
String strConn = "DATABASE=F:\\臨時測試\\world.gdb";
IWorkspace ipWorkspace = ipWsFactory.OpenFromString(strConn,0);
IFeatureWorkspace ipFtWorkspace = (IFeatureWorkspace)ipWorkspace;
IFeatureDataset ipFtDataset = ipFtWorkspace.OpenFeatureDataset("world");
IEnumDataset ipEnumDataset = ipFtDataset.Subsets;
ipEnumDataset.Reset();
IDataset ipDataset = ipEnumDataset.Next();
while (ipDataset!=null)
{
IFeatureClass ipFtClass = (IFeatureClass)ipDataset;
IFeatureLayer ipFtLayer = new FeatureLayerClass();
ipFtLayer.FeatureClass = ipFtClass;
ipFtLayer.Name = ipDataset.Name;
//對圖層做相關操作處理
ipDataset = ipEnumDataset.Next();
ComReleaser.ReleaseCOMObject(ipFtClass);
ComReleaser.ReleaseCOMObject(ipFtLayer);
}
ComReleaser.ReleaseCOMObject(ipWorkspace);
ComReleaser.ReleaseCOMObject(ipFtWorkspace);
ComReleaser.ReleaseCOMObject(ipFtDataset);
ComReleaser.ReleaseCOMObject(ipEnumDataset);
ComReleaser.ReleaseCOMObject(ipDataset);
ComReleaser.ReleaseCOMObject(ipWsFactory);
ComReleaser.ReleaseCOMObject(ipWsFactoryLock);
}
