AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
DAX
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.01.2023, 15:57   #1  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5813 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Logger Посмотреть сообщение
Работает пакетная обработка (тестировали как в IL, так и в p-code)
1. Собирает информацию в аксапте.
2. Формирует в темп папке csv файл при помощи класса TextIo
3. Закрывает файл TextIo (finalize + обнуление файловой переменной, хотя после finalize она и так null)
4. Пакует csv файл в zip архив вызовом 7zip архиватора
5. Удаляет csv файл.
6. Кладет zip архив в базу аксапты.

Обнаружилась проблема: случайным образом архиватор при упаковке не может получить доступа csv файлу и поэтому создает пустой архив размером 22 байта.
Попробовал WinRar Та же проблема. Не может получить доступ к файлу.
Надо было разморозить курицу добавить параметров архиватору У WinRar это параметр -dh "compress files opened for writing", как щас помню, а у 7z вроде должны были подойти
Код:
-ssw : compress shared files                                         
-sse : stop archive creating, if it can't open some input file
Правда, потом пришлось бы руками удалять csv-файлы, которые не смог бы удалить архиватор...
Цитата:
Сообщение от Logger Посмотреть сообщение
В итоге заменили все вызовы TextIo на System.IO.StreamWriter
Очистку ресурсов делаем как
streamWriter.Close();
streamWriter.Dispose();
streamWriter = null;

все заработало. Архиватор всегда пакует все с одной попытки. За 2 суток ни одной проблемы.
На проектах D365FO тоже наступали на такие грабли, правда, там ситуация попроще, потому что в ядре появился класс TextStreamIO - аналогичный TextIO, но принимающий на вход .NET-овский Stream. В итоге там работа с файлами была переделана так:
  1. Создать FileStream
  2. Создать TextStreamIO
  3. ... что-то делать с файлом ...
  4. Вызывать FileStream.Dispose()
  5. Вызывать TextStreamIO.finalize() и, на всякий случай, делать TextStreamIO = null.

Последний раз редактировалось gl00mie; 20.01.2023 в 16:16.
За это сообщение автора поблагодарили: Logger (15), Товарищ ♂uatr (4).
Старый 20.01.2023, 16:17   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,995 / 3293 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от gl00mie Посмотреть сообщение
...Надо было разморозить курицу добавить параметров архиватору ...
Вот я это чувствовал!
Раз Total Commander мог файл просмотреть и скопировать, значит и архиватор должен был уметь. Не хватило терпения дочитать все описание ключей командной строки.

Но, вообще, мне кажется, что безопаснее использовать .net классы для создания файлов. Если блокировка с файла не снята, то фиг знает, что там еще не доделано. Может не сделан flush на диск последней порции записываемых данных (хотя я это не проверял).
Теги
7zip, finalize, garbage collector, gc, rar, textio, winrar, архивирование

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
D365 как получить список всех меточных файлов swr DAX: Программирование 1 10.08.2020 10:45
Как посмотреть исходные имена файлов в MSP-пакете gl00mie DAX: Администрирование 2 19.11.2017 10:14
bojensen: Performing File IO with the TextIo Class [AX 2012] Blog bot DAX Blogs 0 04.12.2012 13:11
Хранение файлов AlexeyVS DAX: Программирование 6 03.09.2010 11:27
Мертвые блокировки при резерве Logger DAX: Программирование 36 19.11.2007 16:29

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 05:08.