我正在使用ArcObjects将xls和csv文件的批处理导入到地理数据库中。该部分工作正常,但导入之后,我想删除该文件。但是,这不起作用,因为文件仍然是打开的。所使用的任何接口都不会从IDisposable下降或公开一个Close方法。我还尝试使用ComReleaser来强制关闭我打开的所有COM对象,但这也不起作用。我看到的关于关闭连接的唯一事情是,我需要删除对这些类型的所有引用,并强制垃圾收集,这是违反标准的(这是有充分理由的)。
下面是用于excel导入的方法:
private ServiceResult<IEnumerable<int>> InsertControlsFromXls(FileInfo xlsFile) {
ServiceResult<IEnumerable<int>> result = new ServiceResult<IEnumerable<int>>();
using(ComReleaser comReleaser = new ComReleaser()) {
//read in the spreadsheet as a workspace
Type factoryType = Type.GetTypeFromProgID("esriDataSourcesOleDB.ExcelWorkspaceFactory");
IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);
IWorkspace workspace = workspaceFactory.OpenFromFile(xlsFile.FullName, 0);
IFeatureWorkspace remoteWorkspace = (IFeatureWorkspace)OpenWorkspace();
IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
IWorkspaceEdit2 session = (IWorkspaceEdit2)remoteWorkspace;
IMultiuserWorkspaceEdit multiuserWorkspace = (IMultiuserWorkspaceEdit)remoteWorkspace;
comReleaser.ManageLifetime(workspaceFactory);
comReleaser.ManageLifetime(workspace);
comReleaser.ManageLifetime(remoteWorkspace);
comReleaser.ManageLifetime(featureWorkspace);
comReleaser.ManageLifetime(session);
comReleaser.ManageLifetime(multiuserWorkspace);
try {
//session.StartEditing(false);
multiuserWorkspace.StartMultiuserEditing(esriMultiuserEditSessionMode.esriMESMVersioned);
session.StartEditOperation();
Match tableMatch = _tableRecReg.Match(xlsFile.Name);
string tableName = tableMatch.Success ? tableMatch.Groups[1].Value + "$" : "Sheet1$";
ITable table = featureWorkspace.OpenTable(tableName);
result.Value = CopyAllFeatures(table, remoteWorkspace.OpenFeatureClass(AppSettings.DefaultSchema + "." + ControlMap.TableName));
session.StopEditOperation();
session.StopEditing(true);
} catch {
session.AbortEditOperation();
session.StopEditing(false);
throw;
}
}
return result;
}发布于 2015-06-15 13:53:34
好的,我用ComReleaser对象疯狂地工作了。基本上,我扫描了我的代码,每当我从ArcObjects中找到任何东西时,我都会附加一个ComReleaser来管理它。基本上,我只是在做手动内存管理。无论如何,只要发布了EVERYTHING (即使它看起来不相关),它似乎就会释放该文件。正如上面的注释所述,ComReleaser类应该在幕后使用ReleaseComObject,因此路径也应该工作。
发布于 2015-10-14 05:18:38
我猜在你的样本中是由ITable引起的。表对象将锁定工作表。至少,它在其他地理数据库中做到了这一点。
不确定CopyAllFeatures做什么,但也要注意ICursor。
https://stackoverflow.com/questions/30783703
复制相似问题