Снятие блокировки с созданного шэйп-файла

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
Ответить
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Снятие блокировки с созданного шэйп-файла

Сообщение Tereha » 22 май 2012, 08:32

Таким образом я создаю шэйп-файл:

Код: Выделить всё

IFeatureClass featClass = featWorkspace.CreateFeatureClass(shpName, fields, null, null, esriFeatureType.esriFTSimple, "Shape", "");
При этом процесс блокирует шейп-файл , в каталоге созданного шэйп файла появляется строка типа
имя_файла.shp.имя_компа.имя_процесса.lock
Каким образом можно снять блокировку?

Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Снятие блокировки с созданного шэйп-файла

Сообщение Дмитрий Барышников » 22 май 2012, 09:10

Наверное надо уничтожить объект featClass. featClass = NULL. Или вызвать у него Release.

Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Снятие блокировки с созданного шэйп-файла

Сообщение Tereha » 22 май 2012, 09:42

У featclass нет метода Release, а featclass = null не снял блокировку.
Проблема в том, что я ставлю программу на сервер. Когда первый пользователь запускает программу , она создает шэйп файл "на лету". Далее из программы можно удалять некоторые объеты слоя и создавать новые. А вот при запуске другой копии программы другим пользователем - удалить этот шэйп файл с целью пересоздания не удается.
Собственно достаточно чтобы при отсутствии такого шэйп файла процесс мог его создать, а остальные копии просто пользовались им - подключали этот слой, удаляли на карте объекты слоя и создавали новые. Новый список объектов для отображения на слое формируется запросом к базе данных - каждой записи соответствует свой объект слоя.

Аватара пользователя
novia
Гуру
Сообщения: 2261
Зарегистрирован: 29 апр 2011, 15:06
Репутация: 489
Откуда: Тель-Авив

Re: Снятие блокировки с созданного шэйп-файла

Сообщение novia » 22 май 2012, 09:49

а остальные копии просто пользовались им - подключали этот слой, удаляли на карте объекты слоя и создавали новые.
шейп-файл не многопользовательская БГД... редактор может быть только один. тот, кто первый создал файл получил эксклюзивную блокировку на редактирование. в любом случае 100500 пользователей (и даже 2) не смогут править один и тот же файл.

попробуйте в этот момент добавить файл в arcmap - если получится - значит чтение версии файла до изменений - возможно в вашем случае.
понравилось? жми палец вверх :!:

Аватара пользователя
novia
Гуру
Сообщения: 2261
Зарегистрирован: 29 апр 2011, 15:06
Репутация: 489
Откуда: Тель-Авив

Re: Снятие блокировки с созданного шэйп-файла

Сообщение novia » 22 май 2012, 09:50

удалить файл, используемый в другом экземпляре приложения вы также не сможете из-за блокировки.
понравилось? жми палец вверх :!:

Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Снятие блокировки с созданного шэйп-файла

Сообщение Дмитрий Барышников » 22 май 2012, 09:53

А если уничтожать сам воркспэс (featWorkspace)?

Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Снятие блокировки с созданного шэйп-файла

Сообщение Tereha » 22 май 2012, 10:52

1. Мне кажется процесс должен иметь возможность после создания шейп-файла снимать блокировку. Не снимать блокировку из других запущенных программ или процессов, а сам создавший файл процесс снимает блокировку.
Любой пользователь, обладающий правами должен иметь возможность изменить состав шейп файла.
2. Задача сейчас следующая. Есть шейп файл, содержащий все объекты. На его основе в arcmap я создаю постоянный слой.
Любой пользователь должен уметь управлять составом отображаемых символов. Скажем - меня интересуют только события за сегодняшний день или за какой-то период. Сейчас я просто чищу таблицу, т.е. фактически меняю шейп файл

Код: Выделить всё

public void clearSetOfFeatures(string layerName)
        {
            ESRI.ArcGIS.Geodatabase.IQueryFilter qFilter = new ESRI.ArcGIS.Geodatabase.QueryFilter();
            qFilter.WhereClause = "";
            qFilter.SubFields = "Shape";
            ESRI.ArcGIS.Geodatabase.IFeatureClass featureClass = null;
            ESRI.ArcGIS.Carto.IFeatureLayer featureLayer = getLayerByName(layerName) as ESRI.ArcGIS.Carto.IFeatureLayer;
            ESRI.ArcGIS.Geodatabase.IFeatureCursor cursor = featureLayer.Search(qFilter, true);
            featureClass = featureLayer.FeatureClass;
            ESRI.ArcGIS.Geodatabase.ITable table = (ESRI.ArcGIS.Geodatabase.ITable)featureClass;
            table.DeleteSearchedRows(qFilter);
        }
Пришла пора сделать правильно. Думаю как.

Аватара пользователя
novia
Гуру
Сообщения: 2261
Зарегистрирован: 29 апр 2011, 15:06
Репутация: 489
Откуда: Тель-Авив

Re: Снятие блокировки с созданного шэйп-файла

Сообщение novia » 22 май 2012, 10:59

Мне кажется процесс должен иметь возможность после создания шейп-файла снимать блокировку.
должен. для этого надо прекратить редакторское подключение к файлу
Скажем - меня интересуют только события за сегодняшний день или за какой-то период.
определяющий запрос и не надо ничего пересоздавать
или просто выборка
Любой пользователь, обладающий правами должен иметь возможность изменить состав шейп файла.
с шейп-файлами одновременно правки будет вносить только один. то есть если открыта одна сессия редактировая - второй быть не может по определению.
смотреть - сколько угодно. правки первого станут видны после сохранения и перезагрузки файла во всех читателях.
Любой пользователь, обладающий правами
учитывая, что вы работаете с шейпом права пользователя будут определяться политикой доступа к файлам операционной системы (или домена, если папка с файлом - сетевая). то есть если пользователь может не входя в вашу систему открыть QGIS и сломать файл (или просто убить атрибуты, открыв таблицу dbf в Excel), то защита на уровне пароля в приложении, которое создаете вы - не более чем защита от дурака.
понравилось? жми палец вверх :!:

Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Снятие блокировки с созданного шэйп-файла

Сообщение Tereha » 22 май 2012, 11:17

1. Если не сложно - как отключить редакторское подключение к файлу? Или где посмотреть? Собственно это я и ищу, но пока не получается.
Если я правильно понимаю, сессия редактирования включается при выполнении команды создания shape файла? Как ее включить явно?
Вот текст создания shape файла:

Код: Выделить всё

        public void createShpFile(string shpName, DataTable dataTable)                         
        {
            //++++++++++++++  Create a new Shapefile with given name +++++++++++++++++++++++++++
            //Get the factory
            ShapefileWorkspaceFactory factory = new ShapefileWorkspaceFactory();

            //Create a workspace
            IWorkspaceName workspaceName = factory.Create(parentDirectory, catalogName, null, 0);

            IName name = workspaceName as IName;

            //QI to IFeatureWorkspace
            IFeatureWorkspace featWorkspace = (IFeatureWorkspace)name.Open();

            // Create a Fields collection to describe the fields of the new feature class.
            IFields fields = new Fields();
            IFieldsEdit fieldsEdit = fields as IFieldsEdit;

            // Add an "OBJECTID" field (feature classes must have this!)
            IField oidField = new Field();
            IFieldEdit oidFieldEdit = oidField as IFieldEdit;
            oidFieldEdit.Name_2 = "OBJECTID";
            oidFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;
            fieldsEdit.AddField(oidField);

            // Create a geometry definition object describing the geometries

            ISpatialReferenceFactory srFactory = new SpatialReferenceEnvironmentClass();

            IGeographicCoordinateSystem gcs = srFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
            IProjectedCoordinateSystem pcs = srFactory.CreateProjectedCoordinateSystem((int)esriSRProjCSType.esriSRProjCS_Pulkovo1942GK_6);

            IGeometryDef geometryDef = new GeometryDef();
            IGeometryDefEdit geomDefEdit = geometryDef as IGeometryDefEdit;
            geomDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
            geomDefEdit.SpatialReference_2 = pcs;

            // Add the "Shape" field that will be storing the geometry of each feature
            IField shpField = new Field();
            IFieldEdit shpFieldEdit = shpField as IFieldEdit;
            shpFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
            shpFieldEdit.Name_2 = "Shape";
            shpFieldEdit.GeometryDef_2 = geomDefEdit;
            fieldsEdit.AddField(shpField);

            esriFieldType fieldType;
            int fieldLength;
            int i = 0;

            foreach (DataColumn col in dataTable.Columns)
            {
                IField aField = new Field();
                IFieldEdit aFieldEdit = aField as IFieldEdit;
                getFieldType(col, out fieldType, out fieldLength);
                //if (i == 0)
                //       aFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;
                //else
                    aFieldEdit.Type_2 = fieldType;//esriFieldType.esriFieldTypeString
                string colName = col.ColumnName;
                if (colName.ToLower() == "площадь_нелесной_зоны")
                    colName = "ПлощадьНелеснойЗоны";
                else if (colName == "код_пожара_сзбаол")
                    continue;// colName = "кодПожаразбаол";
                else if (colName == "код_района_сзбаол")
                    continue;//

                aFieldEdit.Name_2 = colName;
                aFieldEdit.Length_2 = fieldLength;
                fieldsEdit.AddField(aField);
                i++;
            }
            //Create FeatureClass
            IFeatureClass featClass = featWorkspace.CreateFeatureClass(shpName, fields, null, null, esriFeatureType.esriFTSimple, "Shape", "");

        }
2. Когда я подключаю созданные программно слои в arcmap - тоже появляется файл .lock. Но при этом программа и очищает таблицу атрибутов и пересоздает ее - блокировка не мешает. При этом если я очищаю таблицу атрибутов программно - в arcmap таблица тоже очищается, несмотря на ее собственные блокировки файла. Видимо там некая особая блокировка, скажем на изменение состава атрибутов.
PS. featWorkspace = null; // ничего не дало

Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

Re: Снятие блокировки с созданного шэйп-файла

Сообщение Ariki » 23 май 2012, 13:38

Может, так сработает?

Код: Выделить всё

System.Runtime.InteropServices.Marshal.ReleaseComObject(featClass);
ну или вообще не присваивать результат создания переменной, пока не возникнет необходимость открытия шейп-файла.

Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Снятие блокировки с созданного шэйп-файла

Сообщение Tereha » 24 май 2012, 06:44

Спасибо, огромное!
Добавлю только ответ с форума ESRI, может кому-то будет интересен:
sr locks are schema locks. So just opening the shapefile will create a schema lock no edits necessary. You need to explicitly release any references to the featureclass and workspace using the comreleaser. It is a bit of a needle in a hay stack to find them all though. It is the only way I know how to do it. I remember once having to wade through thousands of lines of code to do it, the only way was to set break points, monitor the locks and comment out section by section of code.

Ответить

Вернуться в «ArcGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей