1

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を引き続き使用するのが最善でした。

この問題をより適切に管理するために、スクラッチワークスペース(指定されていない場合はシステム温度)にテーブルを作成し、アクセスが終了したらファイルを正しい宛先に移動する予定です。

4

1 に答える 1

1

あなたが投稿したコードは、私が通常行っているものとあまり変わらないように見えますが、ワークスペース ファクトリとジオプロセッサをメソッド呼び出しごとにインスタンス化するのではなく、よりグローバルなレベルに引っ張ってみることができるかもしれません。ジオプロセッサを使用してロックの問題が発生したことを覚えているので、ジオプロセッサを使用したり、アークオブジェクトを直接操作したりしないようにしています。

gis.stackexchange.com でこの質問をしたほうがよいでしょう。私は少なくとも 1 人の ArcObjects 教祖がその場所に頻繁に出入りしていることを知っています。

于 2010-12-29T11:01:44.107 に答える