如何删除使用ArcObjects访问的dbf文件上的模式锁?

时间:2010-12-28 21:23:00

标签: gis arcgis arcobjects

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

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

1 个答案:

答案 0 :(得分:1)

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

你最好在gis.stackexchange.com上提出这个问题。我知道至少有一个ArcObjects专家经常去那个地方。