新建.shp类型的FeatureClass,一系列操作后,想要删除源文件。如何解除文件的占用?

新建IFeatureWorkspace,CreatFeatureClass,然后CreatFeature,最后将图层添加到IMap中,设置渲染方式,显示,然后删除图层。再删除该数据的文件。这一系列操作后如何解除该数据被占用无法删除问题。pFeatureCursor,pFeatureBuffer,workspace,workspaceEdit在CreatFeature完毕后均已释放System.Runtime.InteropServices.Marshal.FinalReleaseComObject()
1.png 2.png 3.png
已邀请:

Luki - https://www.zhihu.com/people/Y-lusheng

赞同来自: Nico 阡陌的根号武

这个问题我以前遇到过,后面仔细看了shapefile白皮书,发现shapefile文件有应该有四种lock文件
SR - schema lock
RD - read lock
ED - edit lock
WR-write lcok
第一种是常规的lock文件,使用arcmap加载的时候也会自动生成这种lock文件,所以这种文件
解锁是比较容易,直接使用IWorkspaceFactoryLockControl 接口即可
    IWorkspaceFactory2 ipWsFactory = new FileGDBWorkspaceFactoryClass();  
IWorkspaceFactoryLockControl ipWsFactoryLock;
ipWsFactoryLock = (IWorkspaceFactoryLockControl)ipWsFactory;

if (ipWsFactoryLock.SchemaLockingEnabled)
{
ipWsFactoryLock.DisableSchemaLocking();
}
第二种是读取文件的时候自动生成的lock文件,暂时没有遇到过这种锁文件
第三种很明显就是编辑时候自动生成的lock文件,停止编辑会自动消失
第四种,也就是你这里遇到的,在create shp文件的时候生成的,释放游标的方法我没有试过,但你这里
没用。我当时的解决方案是,既然不用生成这个文件,为何不直接CreateFeatureBuffer
            try
{
featureClass = (inmemWor as IFeatureWorkspace).CreateFeatureClass(featureClassName + ".shp", fields, CLSID, CLSEXT, esriFeatureType.esriFTSimple, "shape", strConfigKeyword);
}
catch (Exception ex)
{
throw new Exception("创建内存图层失败"+ex);
}
finally
{
try
{
Marshal.ReleaseComObject(fields);
Marshal.ReleaseComObject(fieldsEdit);
Marshal.ReleaseComObject(name);
Marshal.ReleaseComObject(workspaceFactory);
Marshal.ReleaseComObject(workspaceName);
Marshal.ReleaseComObject(inmemWor);
//System.Runtime.InteropServices.Marshal.ReleaseComObject(oFeatureClass);
}
catch
{
}

GC.Collect();
}
if (featureClass == null)
{
throw new Exception("创建内存图层失败");
}
IFeatureCursor featureCursorInsert = featureClass.Insert(true);
IFeatureBuffer featureBuffer = featureClass.CreateFeatureBuffer();
var pFeature = featureBuffer as IFeature;
pFeature.Shape = pGeometry;

 

朱新颖

赞同来自: Nico

删除使用IDataset.Delete();IFeatureClass也要释放

Nico - 90后IT女

赞同来自:

具体是图片上这样,还有哪儿没有释放呢?

nfc - GISer

赞同来自:

ESRI.ArcGIS.ADF.RealeaseCOMObject(shapefileWorkspaceFactory);
ESRI.ArcGIS.ADF.RealeaseCOMObject(workspace);
ESRI.ArcGIS.ADF.RealeaseCOMObject(featureClass);
ESRI.ArcGIS.ADF.RealeaseCOMObject(featureCursor);
用到的COM对象都要释放,还有IField,IFields,IFeature,IFeatureBuffer

要回复问题请先登录注册