Как снять блокировку схемы с файла dbf, доступного с помощью ArcObjects?

Я создаю собственный инструмент геообработки для ArcGIS Desktop / Server. Во время работы инструмента я создаю файл dbf и получаю доступ к его содержимому с помощью курсора. Блокировка этого файла сохраняется после завершения работы инструмента и может быть снята только путем перезапуска ArcMap / ArcCatalog. Есть ли программный метод снятия блокировки схемы?

Я вошел в приведенный ниже код, строка за строкой. Создание ITable ArcObject создает файл блокировки, заканчивающийся на «.sr.lock», а создание объекта ICursor создает файл блокировки, заканчивающийся на «.rd.lock», в том же каталоге, что и файл dbf. Без использования метода 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 или проводника Windows. Мне удалось удалить папку с помощью инструмента геообработки Delete_management.

Я рассматривал возможность доступа к dbf с помощью метода, отличного от ArcObjects, но я понял, что, вероятно, столкнусь с этой проблемой позже с классами объектов и базами геоданных, поэтому было лучше продолжать использовать ArcObjects.

Чтобы лучше справиться с этой проблемой, я намерен создать таблицу в временной рабочей области (системная временная среда, если не указана), а затем переместить файл в правильное место назначения, когда я закончу доступ к нему.


person Michael Allan Jackson    schedule 28.12.2010    source источник


Ответы (1)


Опубликованный вами код не слишком отличается от того, что я обычно делаю, но, возможно, вы могли бы попробовать вытащить фабрику рабочей области и геообработчик на более глобальный уровень вместо того, чтобы создавать их экземпляры при каждом вызове метода. Я помню, как сталкивался с некоторыми проблемами блокировки при использовании геообработки, поэтому стараюсь избегать его использования и, по возможности, напрямую работать с arcobjects.

Лучше задать этот вопрос на gis.stackexchange.com. Я знаю по крайней мере одного гуру ArcObjects, часто бывающего в этом месте.

person cfern    schedule 29.12.2010
comment
Спасибо, попробую gis.stackexchange.com. У меня был геообработчик на уровне класса, но я попытался переместить его в метод, надеясь, что это поможет. Блокировка происходит при использовании ArcObject ITable, вывод dbf от геообработки не заблокирован. Если бы только у ArcObjects, которые создавали блокировки, были методы close ()! - person Michael Allan Jackson; 29.12.2010
comment
Я нашел существующий вопрос: gis.stackexchange.com/questions/3580/ - person Michael Allan Jackson; 29.12.2010