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

ADN Club => AutoCAD .NET API => Тема начата: Андрей Бушман от 27-02-2014, 16:04:28

Название: Чтение Database из двоичного потока (Stream)
Отправлено: Андрей Бушман от 27-02-2014, 16:04:28
Доброго времени суток.

Можно ли как-то получить Database из бинарного потока (Stream)? Например, DWG файл с определением блока хранится в виде записи в базе данных некоторой СУБД. Очень не хочется заниматься распаковкой DWG во временный файл с последующим его чтением и уничтожением.

Спасибо
Название: Re: Чтение Database из двоичного потока (Stream)
Отправлено: Дима_ от 27-02-2014, 17:19:14
ИХМО - это тот случай когда сделать "в лоб" не грех. А вот по поводу файлов в СУБД - это в свое время рассматривалось как предательство Родины.
Название: Re: Чтение Database из двоичного потока (Stream)
Отправлено: Андрей Бушман от 27-02-2014, 17:25:38
в основе любой точки зрения должны лежать объективные основания :)
Название: Re: Чтение Database из двоичного потока (Stream)
Отправлено: Дима_ от 27-02-2014, 17:36:29
Объективно - автокад в разы дольше работает с файлом нежели идет его копирование на жесткий диск, то-же самое по загрузке из БД - создай виртуальный диск и посмотри выйгрышь - загрузка бинарника из БД с "перехукиванием" потока в файл это как кожанный салон с подогревом руля на ВАЗ 2103 - лучше он от этого не станет.
Название: Re: Чтение Database из двоичного потока (Stream)
Отправлено: Виктор Чекалин от 28-02-2014, 09:12:40
Извиняюсь что влез не в свою тему.

Я с Автокадом работал очень мало, тем не менее, задачка выглядит скорее чисто дотентовская, чем автокадовская.

Если бы мне понадобилось работать именно с бинарным потоком, то я бы создал небольшую обертку типа вот такой:

Код - C# [Выбрать]
  1.     public class BinaryDataDatabaseCreator : IDisposable
  2.     {
  3.         private Database _database;
  4.         private string _tmpDwgFile ;
  5.  
  6.         public BinaryDataDatabaseCreator(byte[] databaseBinaryData)
  7.         {
  8.             // создаем временный файл в папке TEMP. Расширение файла .tmp
  9.             _tmpDwgFile = Path.GetTempFileName();
  10.  
  11.             // Если нужно расширение dwg, то меняем
  12.             _tmpDwgFile = Path.ChangeExtension(_tmpDwgFile, "dwg");
  13.  
  14.             File.WriteAllBytes(_tmpDwgFile, databaseBinaryData);
  15.  
  16.             // читаем dwg файл. Как это правильно делать, думаю вы знаете.
  17.             _database = new Database(_tmpDwgFile);
  18.         }
  19.        
  20.         public Database Database
  21.         {
  22.             get { return _database; }            
  23.         }
  24.  
  25.         public void Dispose()
  26.         {
  27.             // удаляем временный файл
  28.             File.Delete(_tmpDwgFile);
  29.  
  30.             // Если класс Database реализует интерфейс IDisposable (не знаю так это или нет),
  31.             // то для него тоже выполним метод Dispose()
  32.             _database.Dispose();
  33.         }
  34.     }

Использование:
Код - C# [Выбрать]
  1.             var data = GetDwgBinaryDataFromDatabase();
  2.  
  3.             using (BinaryDataDatabaseCreator dataDatabaseCreator = new BinaryDataDatabaseCreator(data))
  4.             {
  5.                 var database = dataDatabaseCreator.Database;
  6.  
  7.                 // Дальше работаем с базой по своему усмотрению
  8.  
  9.             } // Здесь .NET сам позаботиться о том чтобы удалить временный файл

Понятное дело что здесь все равно в итоге идет работа через файл. Тем не менее, беспокоиться каждый раз об удалении файла уже не нужно. 
Название: Re: Чтение Database из двоичного потока (Stream)
Отправлено: Андрей Бушман от 28-02-2014, 10:47:49
Если бы мне понадобилось работать именно с бинарным потоком, то я бы создал небольшую обертку типа вот такой:
Это решение, конечно же, очевидно и напрашивается само собой, однако... Вы же понимаете, что это не совсем то, о чём я спрашивал. :) Суть вопроса в том, чтобы читать из потока (MemoryStream), что называется "на лету". Подозреваю, что это не удастся, но мало ли, чем чёрт не шутит... Может всё же есть недокументированные функции C++ для которых можно было бы написать обёртку.

За код, конечно же, спасибо. :)