Как узнать, что файл требует recover'а

Автор Тема: Как узнать, что файл требует recover'а  (Прочитано 7816 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн bargoolАвтор темы

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Сохраняю файл с помощью Database.SaveAs.
При этом, если сохраняемый файл требует recover'а и там, куда сохраняем, уже есть такой файл - сохранения не происходит, но и никаких ошибок тоже нет.
Как бы отследить, что нужен recover, либо, что запись так и не произошла?

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

П.П.С.: Битый файл пока не могу приложить, к сожалению  :(
Алексей

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как узнать, что файл требует recover'а
« Ответ #1 : 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
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bargoolАвтор темы

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Re: Как узнать, что файл требует recover'а
« Ответ #2 : 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 тоже не поможет.
Алексей

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как узнать, что файл требует recover'а
« Ответ #3 : 07-07-2014, 19:59:59 »
И думаю, раз присутствует то, что в П.С. в первом сообщении, ARX-овский saveAs тоже не поможет.
Странный файл. Никогда с таким не сталкивался. А если сохранять под другим именем?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Как узнать, что файл требует recover'а
« Ответ #4 : 08-07-2014, 19:14:17 »
либо, что запись так и не произошла?
Время последнего изменения файла?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как узнать, что файл требует recover'а
« Ответ #5 : 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, и тут уже ничего не поделаешь...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bargoolАвтор темы

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Re: Как узнать, что файл требует recover'а
« Ответ #6 : 31-07-2014, 23:39:26 »
Странный файл. Никогда с таким не сталкивался. А если сохранять под другим именем?
Моя программа именно делает сохранение в другое место.
Я грешу на одну команду, которую товарищ сделал на лиспе. Она в текущем файле на слоях внешних ссылок создает примитивы O_o
После этого начинается такая вот шляпа
Загорулькин Дмитрий, попробую позже. Думаю, там будет обновленное время.

Когда-то по просьбе Евгения Елпанова я делал arx-файл, который помогал проверить нормальный ли dwg-файл или нет. Код выглядел так:
Т.е. просто открыть файл с помощью Database.ReadDwgFile, и посмотреть, получится ли?
Алексей

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как узнать, что файл требует recover'а
« Ответ #7 : 01-08-2014, 00:06:16 »
Т.е. просто открыть файл с помощью Database.ReadDwgFile, и посмотреть, получится ли?
Да. Не забудь заключить этот код в try/catch/finally. В ObjectARX в случае неуспешной операции возвращается ненулевой код возврата, а в AutoCAD .NET API видимо будет исключение (не проверял но уверен на 99%).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение