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