Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: bargool от 04-07-2014, 15:12:08

Название: Как узнать, что файл требует recover'а
Отправлено: bargool от 04-07-2014, 15:12:08
Сохраняю файл с помощью Database.SaveAs.
При этом, если сохраняемый файл требует recover'а и там, куда сохраняем, уже есть такой файл - сохранения не происходит, но и никаких ошибок тоже нет.
Как бы отследить, что нужен recover, либо, что запись так и не произошла?

П.С.: Кстати. Вручную открываем такой файл. На вопрос о продолжении открытия битого файла отвечаем, что "Все равно продолжай". Чего-нибудь меняем, а потом сохраняем файл - изменения не будут записаны. Но опять же - никаких ошибок или уведомлений не выскакивает. Опасное поведение, ИМХО.

П.П.С.: Битый файл пока не могу приложить, к сожалению  :(
Название: Re: Как узнать, что файл требует recover'а
Отправлено: Александр Ривилис от 04-07-2014, 15:31:19
Такого API нет ни в ObjectARX, ни в AutoCAD .NET API
Теоретически можешь попробовать вместо Database.SaveAs вызывать через P/Invoke AcDbDatabase::saveAs, но не уверен что это что-то даст. Если файл тако уже есть, то его нужно предварительно переименовать/удалить, а потом уже сохранять свой. И непонятно как ты смог в Database создать что-то такое, что требует recover (наверное не recover, а audit).
В AutoCAD 2015 похожее API появилось: http://adn-cis.org/api-dlya-proverki-chertezha-novyij-v-autocad-2015.html
Название: Re: Как узнать, что файл требует recover'а
Отправлено: bargool от 04-07-2014, 15:42:50
Такого API нет ни в ObjectARX, ни в AutoCAD .NET API
Теоретически можешь попробовать вместо Database.SaveAs вызывать через P/Invoke AcDbDatabase::saveAs, но не уверен что это что-то даст. Если файл тако уже есть, то его нужно предварительно переименовать/удалить, а потом уже сохранять свой. И непонятно как ты смог в Database создать что-то такое, что требует recover (наверное не recover, а audit).
В AutoCAD 2015 похожее API появилось: http://adn-cis.org/api-dlya-proverki-chertezha-novyij-v-autocad-2015.html
Не я создаю. Пользователь открывает файл, отказывается от recover'а, запускает мою команду, и получает проблему.
У нас 2013-2014, к сожалению.
И думаю, раз присутствует то, что в П.С. в первом сообщении, ARX-овский saveAs тоже не поможет.
Название: Re: Как узнать, что файл требует recover'а
Отправлено: Александр Ривилис от 07-07-2014, 19:59:59
И думаю, раз присутствует то, что в П.С. в первом сообщении, ARX-овский saveAs тоже не поможет.
Странный файл. Никогда с таким не сталкивался. А если сохранять под другим именем?
Название: Re: Как узнать, что файл требует recover'а
Отправлено: Дмитрий Загорулькин от 08-07-2014, 19:14:17
либо, что запись так и не произошла?
Время последнего изменения файла?
Название: Re: Как узнать, что файл требует recover'а
Отправлено: Александр Ривилис от 08-07-2014, 19:56:18
Когда-то по просьбе Евгения Елпанова я делал arx-файл, который помогал проверить нормальный ли dwg-файл или нет. Код выглядел так:
Код - C++ [Выбрать]
  1. static int ads_is_valid_dwg(void)
  2. {
  3.   struct resbuf *pArgs = acedGetArgs () ;
  4.   acedRetNil () ;
  5.   if (pArgs && pArgs->restype == RTSTR) {
  6.     CString dwgfilename = pArgs->resval.rstring;
  7.     AcDbDatabase *pDB = new AcDbDatabase(false);
  8.     Acad::ErrorStatus es = pDB->readDwgFile(dwgfilename,_SH_DENYNO);
  9.     delete pDB;
  10.     if (es == Acad::eOk) acedRetT();
  11.   }
  12.   return (RSRSLT) ;
  13. }
  14.  
Вызов из lisp выглядел так:
Код - Auto/Visual Lisp [Выбрать]
  1. (is_valid_dwg "путь к dwg-файлу")
Ели эта функция возвращала T, то файл нормальный и восстановление не требуется, если nil, то требуется.
Срабатывало это в большинстве случаев, но не в 100%. Иногда (если файл совсем плохой) readDwgFile приводит к Fatal Error, и тут уже ничего не поделаешь...
Название: Re: Как узнать, что файл требует recover'а
Отправлено: bargool от 31-07-2014, 23:39:26
Странный файл. Никогда с таким не сталкивался. А если сохранять под другим именем?
Моя программа именно делает сохранение в другое место.
Я грешу на одну команду, которую товарищ сделал на лиспе. Она в текущем файле на слоях внешних ссылок создает примитивы O_o
После этого начинается такая вот шляпа
Загорулькин Дмитрий, попробую позже. Думаю, там будет обновленное время.

Когда-то по просьбе Евгения Елпанова я делал arx-файл, который помогал проверить нормальный ли dwg-файл или нет. Код выглядел так:
Т.е. просто открыть файл с помощью Database.ReadDwgFile, и посмотреть, получится ли?
Название: Re: Как узнать, что файл требует recover'а
Отправлено: Александр Ривилис от 01-08-2014, 00:06:16
Т.е. просто открыть файл с помощью Database.ReadDwgFile, и посмотреть, получится ли?
Да. Не забудь заключить этот код в try/catch/finally. В ObjectARX в случае неуспешной операции возвращается ненулевой код возврата, а в AutoCAD .NET API видимо будет исключение (не проверял но уверен на 99%).