ArcGIS Desktop/Server用のカスタムジオプロセシングツールを作成しています。ツールの実行中に、dbfファイルを作成し、カーソルを使用してその内容にアクセスします。このファイルのロックは、ツールの実行が終了した後も残り、ArcMap/ArcCatalogを再起動することによってのみ削除できます。スキーマロックを削除するプログラム的な方法はありますか?
以下のコードに1行ずつステップインしました。ITable ArcObjectを作成すると、「。sr.lock」で終わるロックファイルが作成され、ICursorオブジェクトを作成すると、dbfファイルと同じディレクトリに「.rd.lock」で終わるロックファイルが作成されます。下部にあるReleaseComObjectメソッドを使用しなくても、両方のファイルが保持されます。カーソルから2番目のロックファイルを削除できますが、テーブルに関連付けられているファイルは取得できません。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を含むフォルダーを削除することはできませんでした。ArcCatalogGUIまたはWindowsExplorerを使用しているときに、親ディレクトリの削除に失敗しました。Delete_managementジオプロセシングツールを使用してフォルダーを削除できました。
ArcObjects以外のメソッドを使用してdbfにアクセスすることを検討していましたが、後でフィーチャクラスとジオデータベースでこの問題が発生する可能性があることに気付いたため、ArcObjectsを引き続き使用するのが最善でした。
この問題をより適切に管理するために、スクラッチワークスペース(指定されていない場合はシステム温度)にテーブルを作成し、アクセスが終了したらファイルを正しい宛先に移動する予定です。