1

我正在为 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。

为了更好地管理这个问题,我打算在临时工作区(如果未指定,则为系统临时)中创建表,然后在我完成访问后将文件移动到正确的目标。

4

1 回答 1

1

您发布的代码看起来与我通常所做的并没有太大不同,但也许您可以尝试将工作空间工厂和地理处理器拉到更全局的级别,而不是在每次方法调用时实例化它们。我确实记得在使用地理处理器时遇到了一些锁定问题,所以我尽量避免使用它并尽可能直接使用 arcobjects。

你最好在 gis.stackexchange.com 上问这个问题。我知道至少有一位 ArcObjects 大师经常光顾那个地方。

于 2010-12-29T11:01:44.107 回答