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

Я создаю пользовательский инструмент геообработки для 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 GUI или Windows Explorer.Мне удалось удалить папку с помощью инструмента геообработки Delete_management.

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

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

1 Ответ

1 голос
/ 29 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...