Как узнать результат ответа на запрос о сохранении файла

Автор Тема: Как узнать результат ответа на запрос о сохранении файла  (Прочитано 6236 раз)

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

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Никак не могу найти как получить результат ответа на запрос о сохранении файла при закрытии, вот это вот окошко:


Задача приблизительно следующая, нужно записать какие файлы пользователь редактировал.
Можно подписаться на соответствующие события
Код - C# [Выбрать]
  1.       App.DocumentCollection dm = App.Application.DocumentManager;
  2.       dm.DocumentToBeDestroyed += new App.DocumentCollectionEventHandler(ObjectEvents.DocumentManager_DocumentToBeDestroyed);
  3.       dm.DocumentDestroyed += new App.DocumentDestroyedEventHandler(ObjectEvents.DocumentManager_DocumentDestroyed);
и смотреть какие файлы закрываются, и если файл открыт в режиме только для чтения эту запись не делать (вернее делать, но в другой список), но часто открывают файлы с возможностью записи, но "только посмотреть" и при закрытии файл или не сохраняют вообще или сохраняют под новым именем. Собственно роюсь уже несколько дней и что то ничего кроме сверки времени редактирования файла в событии DocumentToBeDestroyed и DocumentDestroyed  на ум не приходит.
Так сказать, прошу помощь зала.

Отмечено как Решение Владимир Шу 15-10-2020, 10:00:20

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Спасибо, вроде подходит.
Код накиданный на скорую руку ниже, но в нем меня беспокоит момент автосохранения и захардкоренное расширение временных файлов. Переменной содержащей это значение никакой нет?
Код - C# [Выбрать]
  1.   public class Commands
  2.   {
  3.     const string ns = "bx";
  4.  
  5.     static List<string> SavedFils = new List<string>();
  6.     static Dictionary<string, bool> dbEvents = new Dictionary<string, bool>();
  7.  
  8.  
  9.     [Rtm.CommandMethod(ns, "Start1", Rtm.CommandFlags.Session)]
  10.     static public void StartAuto()
  11.     {
  12.       App.DocumentCollection dm = App.Application.DocumentManager;
  13.  
  14.       dm.DocumentCreated += new App.DocumentCollectionEventHandler(DocumentManager_DocumentCreated);
  15.       dm.DocumentToBeDestroyed += new App.DocumentCollectionEventHandler(DocumentManager_DocumentToBeDestroyed);
  16.       dm.DocumentDestroyed += new App.DocumentDestroyedEventHandler(DocumentManager_DocumentDestroyed);
  17.  
  18.       foreach (App.Document doc in dm)
  19.       {
  20.         doc.Database.SaveComplete += new Db.DatabaseIOEventHandler(Database_SaveComplete);
  21.         dbEvents.Add(doc.Database.OriginalFileName, true);
  22.       }
  23.     }
  24.  
  25.     [Rtm.CommandMethod(ns, "Stop1", Rtm.CommandFlags.Session)]
  26.     static public void StopAuto()
  27.     {
  28.       App.DocumentCollection dm = App.Application.DocumentManager;
  29.       dm.DocumentCreated -= new App.DocumentCollectionEventHandler(DocumentManager_DocumentCreated);
  30.       dm.DocumentToBeDestroyed -= new App.DocumentCollectionEventHandler(DocumentManager_DocumentToBeDestroyed);
  31.       dm.DocumentDestroyed -= new App.DocumentDestroyedEventHandler(DocumentManager_DocumentDestroyed);
  32.  
  33.       foreach (App.Document doc in dm)
  34.       {
  35.         if (dbEvents.ContainsKey(doc.Database.OriginalFileName))
  36.         {
  37.           doc.Database.SaveComplete -= new Db.DatabaseIOEventHandler(Database_SaveComplete);
  38.           dbEvents.Remove(doc.Database.OriginalFileName);
  39.         }
  40.       }
  41.     }
  42.  
  43.     internal static void DocumentManager_DocumentCreated(object sender, App.DocumentCollectionEventArgs e)
  44.     {
  45.       if (!dbEvents.ContainsKey(e.Document.Database.OriginalFileName))
  46.       {
  47.         e.Document.Database.SaveComplete += new Db.DatabaseIOEventHandler(Database_SaveComplete);
  48.         dbEvents.Add(e.Document.Database.OriginalFileName, true);
  49.       }
  50.     }
  51.  
  52.     internal static void DocumentManager_DocumentToBeDestroyed(object sender, App.DocumentCollectionEventArgs e)
  53.     {
  54.       //тут отписываемся от реактора на сохранение.
  55.       if (dbEvents.ContainsKey(e.Document.Database.OriginalFileName))
  56.       {
  57.         if (dbEvents[e.Document.Database.OriginalFileName])
  58.         {
  59.           e.Document.Database.SaveComplete -= new Db.DatabaseIOEventHandler(Database_SaveComplete);
  60.           dbEvents.Remove(e.Document.Database.OriginalFileName);
  61.         }
  62.       }
  63.     }
  64.  
  65.     internal static void DocumentManager_DocumentDestroyed(object sender, App.DocumentDestroyedEventArgs e)
  66.     {
  67.       if (SavedFils.Contains(e.FileName))
  68.       {
  69.         string path = @"d:\MyTest.txt";
  70.         string appendText = e.FileName + Environment.NewLine;
  71.         File.AppendAllText(path, appendText);
  72.         SavedFils.Remove(e.FileName);
  73.       }
  74.     }
  75.  
  76.     internal static void Database_SaveComplete(object sender, Db.DatabaseIOEventArgs e)
  77.     {
  78.       FileInfo fi = new FileInfo(e.FileName);
  79.         if (!fi.Extension.Equals(".sv$"))
  80.           SavedFils.Add(e.FileName);
  81.     }
  82.   }


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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Переменной содержащей это значение никакой нет?
Такой переменной нет. Но тебя ведь интересуют dwg  и dxf файлы, так что теоретически все остальные расширения можешь игнорировать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 533
  • Карма: 117
Переменной содержащей это значение никакой нет?
Значение относится к профилю, преполагаю, что значение храниться в реестре. Но с ходу не удалось найти, возможно храниться не в виде строки.

Есть еще переменные SAVENAME, SAVEFILE

Пока файл не сохранен:
SAVENAME = "" (только чтение)
SAVEFILE = "" (только чтение)

При сохранении:
SAVENAME = "C:\Temp\test.dwg" (только чтение)

При автосохранении:
SAVEFILE = "C:\ACAD_USER\TEMP\test_1_33_6500.sv$"

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Переменной содержащей это значение никакой нет?
Значение относится к профилю, преполагаю, что значение храниться в реестре. Но с ходу не удалось найти, возможно храниться не в виде строки.

Конечно же не к профилю (если ты имеешь в виду профиль AutoCAD или профиль пользователя в Windows).



И кроме того в явном виде в файлах regacad24.dll, accore.dll, acdb24.dll  и т.д.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Я сначала поискал в справке, в инете, в реестре, но не нашел и потому спросил. Думаю не буду усложнять, достаточно проверки на "dwg"

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 533
  • Карма: 117
Конечно же не к профилю (если ты имеешь в виду профиль AutoCAD или профиль пользователя в Windows).

1. Я проверил, переключил 2 профиля AutoCAD , в каждом сохранилось свое значение "Расширение для временных файлов"!

2. То, что приведено на скрине, я тоже посмотрел, это зарегистрированные расширения файлов в системе. Запись похоже появляется при установке AutoCAD. И что самое интересное, при изменении "Расширение для временных файлов" в данном разделе не появилось записи с новым расширением.

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Если хочется усложнения, то можно проверять не расширение файла, а сравнивать путь сохранения с путем для автосохранения, такая переменная вроде в автокаде есть, но действительно это не сильно нужно.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
1. Я проверил, переключил 2 профиля AutoCAD , в каждом сохранилось свое значение "Расширение для временных файлов"!
Это "расширение для временных файлов", а не "расширение для автосохранения" - разные это расширения:



Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Если хочется усложнения, то можно проверять не расширение файла, а сравнивать путь сохранения с путем для автосохранения, такая переменная вроде в автокаде есть, но действительно это не сильно нужно.
А что будешь делать если документ сохранили под другим именем (а может и под разными именами) ?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
думаю вряд ли кто то захочет сохранять в папку

и можно проверить совпадает ли путь сохраняемого файла и путь до этой временной папки

Поэтому не совсем понимаю вопрос...

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Поэтому не совсем понимаю вопрос...
Я не про файлы автосохранения, а про то, что твой документ сохранили несколько раз, но под разными именами: File1.dwg, File2.dwg, File3.dwg... Что ты в этом случае будешь делать?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Я искал какой ни будь идентификатор базы данных чертежа, но ничего путного не нашел.
Создавать внутри базы какую то свою метку я не хочу, а потому будет просто записано, что пользователь сохранял файлы с именами: File1.dwg, File2.dwg, File3.dwg ...

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Я искал какой ни будь идентификатор базы данных чертежа, но ничего путного не нашел.
Вроде нашел....
Код - C# [Выбрать]
  1.     [Rtm.CommandMethod("GETGUID")]
  2.     static public void GETGUID()
  3.     {
  4.       // Получение текущего документа и базы данных
  5.       App.Document acDoc = App.Application.DocumentManager.MdiActiveDocument;
  6.       if (acDoc == null) return;
  7.       Db.Database acCurDb = acDoc.Database;
  8.       Ed.Editor acEd = acDoc.Editor;
  9.  
  10.       var FingerprintGuid = acCurDb.FingerprintGuid;
  11.       var VersionGuid = acCurDb.VersionGuid;
  12.  
  13.  
  14.       acEd.WriteMessage($"\nFingerprintGuid = {FingerprintGuid}");
  15.       acEd.WriteMessage($"\nVersionGuid = {VersionGuid}");
  16.  
  17.     }
  18.