我正在为ArcGIS Desktop / Server创建自定义地理处理工具。在工具执行期间,我创建了一个dbf文件并使用游标访问其内容。工具完成执行后,此文件上的锁定仍然存在,只能通过重新启动ArcMap / ArcCatalog来删除。是否有一种删除模式锁的编程方法?
我已逐步进入下面的代码。创建ITable ArcObject会创建以“.sr.lock”结尾的锁定文件,并且创建ICursor对象会在与dbf文件相同的目录中创建以“.rd.lock”结尾的锁定文件。如果不使用底部的ReleaseComObject方法,则两个文件都会保留。我可以从游标中删除第二个锁文件,但不能删除与表关联的文件。即使我删除了dbf文件,锁定文件仍然存在,并且在关闭ArcMap / ArcCatalog之前无法删除父目录。
代码here提示解决方案,但缺少该代码的元素。
public Dictionary<Int32, Dictionary<Int32,Double>> GetTabulatedAreaDict()
{
IGPUtilities3 gpUtil = new GPUtilitiesClass();
Geoprocessor gp = new Geoprocessor();
//Tabulate Area
string tableName = "lcAreaByRru.dbf";
string tablePath = this.tempDirPath + "\\" + tableName;
TabulateArea tabulateArea = new TabulateArea();
tabulateArea.in_zone_data = this.rruPath;
tabulateArea.zone_field = "VALUE";
tabulateArea.in_class_data = this.rasterValue.GetAsText();
tabulateArea.class_field = "VALUE";
tabulateArea.out_table = tablePath;
gp.Execute(tabulateArea, null);
// Extract information from table
IWorkspaceFactory wsf = new ShapefileWorkspaceFactoryClass();
IWorkspace ws = wsf.OpenFromFile(this.tempDirPath, 0);
IFeatureWorkspace fws = (IFeatureWorkspace)ws;
ITable taTable = fws.OpenTable(tableName);// Creates .sr.lock file
//ITable taTable = gpUtil.OpenTableFromString(tablePath); // Creates .sr.lock file
ICursor tableRows = taTable.Search(null, false); // Creates .rd.lock file
IRow tableRow = tableRows.NextRow();
this.tabulatedAreaDict = new Dictionary<Int32, Dictionary<Int32, Double>>();
while (tableRow != null)
{
Int32 id = (Int32)tableRow.get_Value(1); // Feature ID
Dictionary<Int32, Double> valueAreaDict = new Dictionary<Int32, Double>();
for (int i = 2; i < tableRow.Fields.FieldCount; i++)
{
int key = int.Parse(tableRow.Fields.get_Field(i).Name.Split('_')[1]);
double value = (double)tableRow.get_Value(i);
valueAreaDict.Add(key, value);
}
this.tabulatedAreaDict.Add(id, valueAreaDict);
tableRow = tableRows.NextRow();
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(tableRows); //Removes .rd.lock file
System.Runtime.InteropServices.Marshal.ReleaseComObject(taTable); // Does not remove .sr.lock file
return this.tabulatedAreaDict;
}
更新
我发现dbf没有被锁定,但是有与dbf关联的杂散锁文件。当ArcCatalog仍在运行时,我能够删除该表,但是我无法删除包含dbf的文件夹。使用ArcCatalog GUI或Windows资源管理器时,删除父目录失败。我可以使用Delete_management地理处理工具删除该文件夹。
我曾考虑使用非ArcObjects方法访问dbf,但我意识到我可能会在以后使用要素类和地理数据库遇到此问题,因此最好继续使用ArcObjects。
为了更好地管理这个问题,我打算在临时工作空间中创建表(如果未指定,则为系统临时表),然后在我完成访问时将文件移动到正确的目的地。
答案 0 :(得分:1)
您发布的代码与我通常的代码看起来并没有太大差别,但也许您可以尝试将工作区工厂和地理处理器拉到更全局的级别,而不是在每次方法调用时实例化它们。我确实记得使用地理处理器遇到一些锁定问题,所以我尽量避免使用它并尽可能直接使用arcobjects。
你最好在gis.stackexchange.com上提出这个问题。我知道至少有一个ArcObjects专家经常去那个地方。