Имя: Пароль:
1C
1С v8
Чтение/запись больших бинарных файлов
,
0 andrewks
 
19.02.12
23:27
нужен вариант работы с бинарными файлами большой ёмкости, без помещения всего содержимого файла в память (посему adodb.Stream отпадает)

какой ещё объект системы (Win) можно заюзать, дабы можно было блоками читать/писать в/из COMSafeArray?

уж больно неохота в скрипт заворачивать
1 Torquader
 
19.02.12
23:31
Теоретически, если произвольная запись не интересует, то можно Scripting.FileSystemObject и объект TextStream, который читает файлы посимвольно, и также последовательно и посимвольно пишет. Мне через него удавалось с образами дисков работать - конечно, были определённые тормоза, но расход памяти был минимальный.
2 andrewks
 
19.02.12
23:35
посимвольно не устраивает - слишком тормознуто.
мне бы поблочно читать/писать надо
3 andrewks
 
19.02.12
23:38
пока мысль такая, что если ничего лучше не предложат, использовать jscript и его File
4 BOZKURT
 
19.02.12
23:43
(3) а что за файл и что ты с ним будешь делать (и как) ? XML ?
5 andrewks
 
19.02.12
23:44
(4) нет. чистый бинарник. а делать буду - читать/писать
6 H A D G E H O G s
 
19.02.12
23:45
Нетленка это умеет -  прочитать блок и представить его в COM-массиве нужной размерности.
7 andrewks
 
19.02.12
23:46
(6) что за нетленка?
8 BOZKURT
 
19.02.12
23:47
(5)+ ну тоды без ВК думаю никак.. хотя про WScript.Shell почитай еще..
9 andrewks
 
19.02.12
23:48
есть ещё вариант с BinFiles.dll, но чё-то мне этот вариант нравится ещё меньше, чем с jscript
10 H A D G E H O G s
 
19.02.12
23:48
(7) Не знаем нетленку? Бида-бида.
11 H A D G E H O G s
 
19.02.12
23:49
http://infostart.ru/public/15589/

Объект
Addin.FileStream, там описание подробное (в версии 2.2) есть и демопример.
12 BOZKURT
 
19.02.12
23:50
(10) похвали себя, похвали..))
13 H A D G E H O G s
 
19.02.12
23:51
(12) Это -- не кукурузу охранять!
14 andrewks
 
19.02.12
23:51
(11) так что там лучше скачивать - 2.3, или 2.2.?
15 H A D G E H O G s
 
19.02.12
23:52
(14) 2.3
16 andrewks
 
19.02.12
23:53
(15) спасибо, ознакомлюсь с твоей нетленкой ;-)
17 BOZKURT
 
19.02.12
23:55
(13) это еще уметь надо!
18 andrewks
 
19.02.12
23:58
(15) а как она с 8.2 себя ведёт - нормуль?
19 H A D G E H O G s
 
19.02.12
23:58
(18) Под Толстым клиентом - да.
20 andrewks
 
20.02.12
14:42
может, ещё какие варианты будут?
21 andrewks
 
20.02.12
16:25
^
22 Torquader
 
21.02.12
00:26
Ну, можно ещё сваять OLE-сервер, в котором реализовать открытие файла и чтение двоичного блока с произвольного адреса - работы на несколько часов.
23 Inform
 
21.02.12
00:57
ЧтениеТекста?
24 BOZKURT
 
21.02.12
02:59
Вот жешь :)   -

   fileName = "F:\VIDEO\Otryad.Osobogo.Nazna4eniya.2011.DVDRip.avi";
   fso = Новый COMОбъект("Scripting.FileSystemObject");
   fileObject = fso.OpenTextFile(ИмяФайла, 1, 0, 0);
   Пока file.AtEndOfStream = 0 Цикл
     символы = fileObject.Read(1024); //1024 - количество символов, или ReadLine() - для считывания всей строки
     Сообщить(стр);
     ОбработкаПрерыванияПользователя();
   КонецЦикла;
   file.Close();

Книга знаний: Пример чтения и записи текстовых файлов (Scripting.FileSystemObject)
http://www.script-coding.com/WSH/FileSystemObject.html

P.S.
Проверил на большом видео файле, считывание начинается мгновенно, т.е. в память все сразу не кладет.
Также с помощью нее можно и писать в файл.
25 andrewks
 
21.02.12
08:15
(24) не взлетит. будет проблема с нулями. поэтому придётся читать посимвольно, что обернётся тормозами

(22) да зачем писать, уже готовые есть.

ладно, щас буду выбирать какой-нибудь вариант
26 aleks-id
 
21.02.12
09:23
(25) так используй в скрипте из (24) не fso.OpenTextFile а FileOpen
http://msdn.microsoft.com/en-us/library/afh37kh8(v=vs.71).aspx

Mode ставишь Binary и погнал!
27 Torquader
 
21.02.12
10:44
(26) Так если .Net подцепить, то можно всё, что угодно сделать, причём на этом самом .Net
28 kvk
 
21.02.12
15:11
Вот еще вариант:



   // Работа с SAPI: forum.script-coding.com
   ИмяФайла = "D:\kvk\Soft\images\openSUSE\openSUSE-12.1-DVD-i586.iso";
   ИмяВыходногоФайла = "D:\kvk\temp\test.iso";
   РазмерБуфера = 1048576;
   Буфер = "";
   Остаток = "";
   memoryStream = Новый COMОбъект("SAPI.spMemoryStream");
   fileStream = Новый COMОбъект("SAPI.spFileStream");
   fileStream.Open(ИмяФайла);
   outStream = Новый COMОбъект("SAPI.spFileStream");
   outStream.Format.Type = 1;
   outStream.Open(ИмяВыходногоФайла, 3);
   Пока Истина Цикл
       ОбработкаПрерыванияПользователя();
       Байтов = fileStream.Read(Буфер, РазмерБуфера);
       Если Байтов < РазмерБуфера Тогда
           Если Байтов > 0 Тогда
               memoryStream.SetData(Буфер);
               memoryStream.Read(Остаток, Байтов);
               //Сообщить(Остаток);
               outStream.Write(Остаток);
           КонецЕсли;
           Прервать;
       Иначе
           //Сообщить(Буфер);
           outStream.Write(Буфер);
       КонецЕсли;
   КонецЦикла;
   fileStream.Close();
   outStream.Close();
29 andrewks
 
21.02.12
15:17
(28) тэк-тэк-тэк. спич-апи для чтения файлов - оригинально-с!

а он примет COMSafeArray в качестве буфера? тут, я вижу, строка, а строка не катит по уже озвученным причинам (нули и т.п.)
30 kvk
 
21.02.12
15:33
именно COMSafeArray, но стоит проверить. У меня скрипт был на VBS (оттуда взял) - считал хэши довольно быстро (сейчас всё на PowerShell через объекты .Net)
31 andrewks
 
21.02.12
15:34
(30) да, вкусные методы .Net я смотрел, но не хочу к .Net привязываться.
спасибо, сейчас потестю
32 andrewks
 
21.02.12
15:37
(28) да, точно, COMSafeArray возвращает.
просто немного смутило Буфер = "";

серый форму рулит. спасибо :)
33 andrewks
 
21.02.12
15:37
+(32) *серый форум