我正在为 ArcGIS Desktop/Server 创建一个自定义地理处理工具。在工具执行期间,我创建了一个 dbf 文件并使用游标访问其内容。此文件的锁定在工具完成执行后仍然存在,并且只能通过重新启动 ArcMap/ArcCatalog 来解除。是否有删除模式锁的编程方法?
我已经逐行进入了下面的代码。创建 ITable ArcObject 会创建一个以“.sr.lock”结尾的锁定文件,创建 ICursor 对象会在与 dbf 文件相同的目录中创建一个以“.rd.lock”结尾的锁定文件。如果不使用底部的任一 ReleaseComObject 方法,两个文件都会保留。我可以从删除的游标中获取第二个锁定文件,但不能从与表关联的那个中获取。即使我删除了 dbf 文件,锁定文件仍然存在,并且在关闭 ArcMap/ArcCatalog 之前无法删除父目录。
这里有提示解决方案的代码,但缺少该代码的某些元素。
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。
为了更好地管理这个问题,我打算在临时工作区(如果未指定,则为系统临时)中创建表,然后在我完成访问后将文件移动到正确的目标。