Показать сообщение отдельно
Старый 20.01.2023, 15:57   #3  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 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).