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

ADN Club => AutoCAD .NET API => Тема начата: Atomohod от 07-03-2025, 22:55:19

Название: Ошибка чтения файла
Отправлено: Atomohod от 07-03-2025, 22:55:19
Здравствуйте.
Пытаюсь вставить несколько блоков из файла-хранилища dwg в текущий новый файл. При попытке чтения ловлю ошибку доступа eFileAccessErr в строке db.ReadDwgFile. Никак не соображу почему. Пробовал разные варианты с doc.LockDocument - нет результата. Как это можно исправить?
Код - C# [Выбрать]
  1.  [CommandMethod("ProcessDXFConveyor")]
  2.  public void ProcessDXFConveyor()
  3.  {
  4.      Document doc = Application.DocumentManager.MdiActiveDocument;
  5.      Database db = doc.Database;
  6.      Editor ed = doc.Editor;
  7.  
  8.      try
  9.      {
  10.          string frameDwgPath = "G:\\DevProjects\\Titles.dwg";
  11.  
  12.          DwgImporter dwgImporter = new DwgImporter();
  13.          dwgImporter.ImportDWG(frameDwgPath);
  14.      }
  15.      catch (System.Exception ex)
  16.      {
  17.          ed.WriteMessage($"\nОшибка: {ex.Message}");
  18.      }
  19.  }
  20.  
  21.  public void ImportDWG(string path)
  22.  {
  23.      try
  24.      {
  25.          using (Database db = new Database(false, true))
  26.          {
  27.              db.ReadDwgFile(path, FileShare.ReadWrite, true, "LOG.TXT");
  28.              Drawings.Add(db);
  29.          }
  30.      }
  31.      catch (Exception e)
  32.      {
  33.          Application.ShowAlertDialog("Problem with reading block dwg's " + e.Source);
  34.      }
  35.  }
  36.  
Название: Re: Ошибка чтения файла
Отправлено: Александр Ривилис от 07-03-2025, 23:09:31
1. dwg-файл в каталоге доступном и для чтения и для записи?
2. dwg-файл сохранен в версии AutoCAD, который может быть открыт в запущенной версии AutoCAD?
3. Что такое "LOG.TXT"? Вообще-то этот параметр - это пароль dwg-файла. Но насколько я помню этот параметр давно не используется и нужно передавать null.
Название: Re: Ошибка чтения файла
Отправлено: Atomohod от 07-03-2025, 23:19:40
да файл на локальном ПК. Права админские. Открываемый файл (формат dwg 2018) создан в том же каде, где запускаю плагин.
Вариант с пустым паролем я тоже пробовал в таком виде
Код - C# [Выбрать]
  1.  sourceDb.ReadDwgFile(dwgPath, System.IO.FileShare.ReadWrite, true, "");
не сработало. Файл не запаролен
Название: Re: Ошибка чтения файла
Отправлено: Александр Ривилис от 07-03-2025, 23:29:20
Эта ошибка ещё может быть если этот dwg-файл уже открыт в этом или другом AutoCAD (в редакторе или при помощи ReadDwgFile)
Название: Re: Ошибка чтения файла
Отправлено: Александр Ривилис от 07-03-2025, 23:31:29
Ну и ещё одно. Не следует создавать Database в using если собираешься использовать его после using.
Название: Re: Ошибка чтения файла
Отправлено: Atomohod от 07-03-2025, 23:49:42
Эта ошибка ещё может быть если этот dwg-файл уже открыт в этом или другом AutoCAD (в редакторе или при помощи ReadDwgFile)
Точно нет, это я сразу проверил. Этот файл - база блоков, он только для считывания блоков и копирования их в текущий чертеж, кроме метода что я приложил он нигде не читается.
На что еще можно проверить?
Название: Re: Ошибка чтения файла
Отправлено: Александр Ривилис от 08-03-2025, 01:27:20
Есть ещё несколько методов ReadDwgFile. Попробуй их. Возможно этот метод по какой-то причине не работает.
Название: Re: Ошибка чтения файла
Отправлено: Владимир Шу от 09-03-2025, 12:13:59
Небольшое примечание к коду:
После чтения файла с использованием Database.ReadDwgFile() настоятельно рекомендуется вызывать метод Database.CloseInput()
Подробнее тут: adndevblog.typepad.com (https://adndevblog.typepad.com/autocad/2012/07/using-readdwgfile-with-net-attachxref-or-objectarx-acdbattachxref.html) и тут:help.autodesk.com (https://help.autodesk.com/view/OARX/2024/ENU/?guid=OARX-ManagedRefGuide-Autodesk_AutoCAD_DatabaseServices_Database_CloseInput__MarshalAsUnmanagedType_U1__bool)
Название: Re: Ошибка чтения файла
Отправлено: Привалов Дмитрий от 10-03-2025, 07:43:34
При попытке чтения ловлю ошибку доступа eFileAccessErr в строке db.ReadDwgFile
Скорее всего файл кем-то занят.
Замени FileShare.ReadWrite на FileShare.Read.
Если папка G:\\DevProjects\\ общедоступная, возможно кем-то с другой машины заблокирован файл. Лучше папку сделать для чтения.