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);
}