|
Чтение/запись больших бинарных файлов | ☑ | ||
---|---|---|---|---|
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) *серый форум
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |