1s date binare în cerere. Lucrul cu date binare. Ștergerea unui fișier din stocarea temporară

25.01.2021 Siguranță

Platforma tehnologică 1C:Enterprise 8 vă permite să salvați fișiere arbitrare în baza de informații, să le preluați de acolo și să le utilizați căi diferite. Să ne uităm la aceste operații folosind exemple.

Înainte de a încărca un fișier în baza de informații 1C, trebuie să obțineți adresa completă a fișierului de pe disc. Lucrul cu dialogurile de selectare a fișierelor este descris în .

Pentru a stoca fișiere, utilizați un atribut (sau înregistrați o resursă) cu tipul Valori de stocare.

Încărcarea unui fișier arbitrar în baza de informații 1C

Orice fișier poate fi reprezentat ca date binare și încărcat în Depozitarea valorii.

La conversia datelor binare într-un obiect Valori de stocare designul utilizat noi valori de stocare (date, compresie) cu doi parametri:

  1. Date— date binare care trebuie stocate în stocare
  2. Comprimare— raportul de compresie al algoritmului Deflation. Număr întreg în intervalul -1...9. -1 este nivelul de compresie implicit. 0 - fără compresie, 9 - compresie maximă. Valoare implicită: -1. Parametrul este opțional; dacă nu este specificat, compresia nu este utilizată.

//Conversia fișierului în date binare
Fișier = New BinaryData(Path) ;

//Crea obiect nou Valori de stocare

DataStorage = NewValueStorage(Fișier, NewDataCompression(9) ) ;

Salvarea unui fișier arbitrar din baza de informații 1C pe disc

Pentru a salva un fișier din baza de date 1C pe disc, trebuie să determinați calea și numele fișierului. Pentru a face acest lucru, există un dialog de salvare a fișierelor, care lucrează cu care este descris în.

//Obțineți date binare din stocare
//Data Storage - atribut al unui obiect cu tipul Value Storage

//Scrieți datele primite pe disc
//Variabila Path conține adresa completă a fișierului de pe disc
Date. Scrie(Cale);

Vizualizarea unui fișier situat în baza de informații 1C

Pentru a vizualiza un fișier salvat în baza de date, trebuie să aveți instalată pe computer o aplicație care deschide fișierul.

//Obțineți numele fișierului temporar cu extensia necesară
//În variabila Extensie trebuie să puneți extensia fișierului, de exemplu „pdf”
Cale = GetTemporaryFileName(Extensie) ;

// Primiți date din stocare
//Data Storage - atribut al unui obiect cu tipul Value Storage
Data = Datastore. Obține() ;

//Scrieți datele într-un fișier temporar
Date. Scrie(Cale);

//Încercarea de a deschide fișierul în aplicația dorită
//Dacă aplicația nu este găsită, va apărea dialogul de sistem „Deschide cu...”.
Lansați aplicația(Cale);

Datele binare din 1C sunt destinate stocării fișierelor de format arbitrar. Cu ajutorul lor poți:

  • Organizați interacțiunea folosind un protocol binar cu diverse dispozitive;
  • Stocați fișiere de orice format ca atribute ale obiectului metadatelor;
  • Convertiți datele text în binare (utilizate cel mai adesea pentru trimiterea de rapoarte);
  • Lucrați cu date binare în memorie.

Ce poate face sistemul

Când lucrați cu date binare, Platforma 8.3 poate efectua următoarele acțiuni:

  1. Citiți și scrieți date binare;
  2. Mutați datele de la client la server și înapoi folosind stocarea temporară;
  3. Inițializați un obiect de tip „Imagine” folosind fișiere binare;
  4. Citiți-le de pe World Wide Web folosind obiectele „Atașament la e-mail”, „Conexiune HTTP”, etc.
  5. Utilizați instrumente criptografice pentru a cripta și semna atașamente importante;
  6. Folosind obiectul „Data Hashing”, calculați funcția hash.

Salvarea datelor în detalii

De exemplu, să creăm în configurație de testare director.

De fapt, folosirea aceluiași director pentru a stoca informații despre nomenclatură și datele de imagine binare este puțin incorectă. Pentru cantități destul de mari de date și fișiere grele marime mare Pot apărea perioade nedorite de oprire și „frâne” în funcționarea sistemului. Din punct de vedere al sistemului, ar fi mult mai corect să organizăm un director separat „Imagini”, un link către care am putea seta ca tip de recuzită.


Este important de reținut că, din cauza faptului că atributele de tip „ValueStorage” care conțin date binare nu sunt disponibile în modul de aplicație gestionată, ele pot fi accesate numai folosind metoda FormAttributesValue.


Câmpul de mesaj reprezintă o înregistrare de date binare pentru depozitul de valori.

Citirea datelor din recuzită

Să creăm o procesare care va scoate fișierul stocat în formă binară în configurația noastră într-un document de foaie de calcul (acest lucru este necesar, de exemplu, pentru a tipări sigla unei companii).


Practic, acesta este tot codul de care avem nevoie. Folosind operatorul Get(), citim datele binare stocate în atributul de director corespunzător și le transferăm în obiectul „Picture”, care va fi afișat în celula din stânga sus. document foaie de calcul forme (Fig. 9).

Fig.9

Conversia datelor

Nu este obișnuit, dar se întâmplă ca atunci când lucrați cu schimburi non-standard cu sisteme externe, este necesar să convertiți datele din format binar în format Base64 sau invers.

În majoritatea cazurilor, platforma convertește automat datele; dacă acest lucru nu se întâmplă, trebuie să utilizați funcții globale de traducere:

  1. Base64String – convertește valoarea specificată într-un șir de codificare corespunzătoare;
  2. Base64Value – face conversia inversă.

Optimizarea codului de mai sus

Codul prezentat în Fig. 4 funcționează cu siguranță, dar cu o avertizare semnificativă: dacă caseta de selectare „Modality use mode” este bifată în proprietățile de configurare (Fig. 10). În caz contrar, utilizarea acestuia va cauza o eroare.
Fig.10

Pentru a preveni acest lucru, în timp ce vă aflați în modulul de formular element de director, accesați meniul Text->Refactoring->Apeluri sincrone depreciate->Convertire apeluri de modul.

După ceva timp, apelurile sincrone vor fi convertite automat în asincron, iar codul va lua forma (Fig. 11)

Fig.11

Aproape orice informație poate fi stocată într-un depozit de valori, de ex.

... poze (fotografii):

CurrentImage.Object = SprFabric.Link; CurrentImage.DataType = Enumerări.Tipuri de informații suplimentare despre Objects.Image; Stocare = NewValueStorage(NewPicture, NewDataCompression()); CurrentImage.Storage = Storage.Get();

// în acest loc afișează totul... Form Elements.PictureField1.Picture = Storage.Get(); CurrentImage.Write();

...document foaie de calcul:

TabDoc=New TabularDocument; TabDoc.Output(FormElements.TabularDocumentField1); Stocare=NewValueStorage(TabDoc); Scrie();

Sfârșitul procedurii

Procedura RestoreFromStoragePress(Element)

TabDoc=Storage.Get(); Dacă TabDoc<>Nedefinit ThenFormElements.TabularDocumentField1.Output(TabDoc); endIf;

Sfârșitul procedurii

...fișiere arbitrare (date binare):

XZ = NewValueStorage(NewBinaryData(fișier));

Opt acceptă comprimarea datelor plasate în stocare:

XZ = NewValueStorage(NewBinaryData(fișier),NewDataCompression(9));

... prelucrare și raportare externă:

Procedura LoadProcessingIntoStorage(PropsStorageType)

CompressionRate = NewDataCompression(9); //9 PropsStorageType maxim = New StorageValues(New BinaryData("c:\reports\report.epf", Compression Ratio));

Sfârșitul procedurii

Procedure StartProcessingFromStorage(PropsStorageType)

TemporaryFileName = TemporaryFileDirectory()+"report.epf"; BinaryData = PropsStorageType.Get(); BinaryData.Write(TemporaryFileName); ExternalProcessing = ExternalProcessing.Create(TemporaryFileName); ExternalProcessing.GetForm().Open();

Sfârșitul procedurii

Lucrul cu stocarea

Dacă au fost date binare, atunci pot fi restaurate din depozitul de valori folosind metoda Get și scrise într-un fișier folosind metoda Write().

If TypeValue(Stocare)<>Tastați ("BinaryData") Apoi

BinaryData = Storage.Get();

BinaryData = Stocare;

endIf; BinaryData.Write(FileName);

Dacă a fost, de exemplu, un document Word (fișier doc sau alt tip de fișier înregistrat), atunci poate fi deschis astfel:

LaunchApplication(FileName);

Pentru a șterge un câmp de tip Value Storage, trebuie să-l atribuiți Nedefinit:

PropsStorage = Nedefinit;

Lucrul cu fișiere și imagini în limbajul încorporat 1C:Enterprise 8

Scop

Aplicația gestionată implementează un nou mecanism de lucru cu fișierele. Oferă schimb de fișiere între baza de informații și aplicația client. Particularitatea acestui mecanism este că este destinat utilizării în client slabși Web Client și este conceput pentru a ține cont de restricțiile de gestionare a fișierelor impuse de browserele web.

Mecanismul este un set de metode care pot fi folosite pentru a plasa datele stocate local de către utilizator în stocare temporară baza de informatii, transferați aceste informații din stocarea temporară într-o bază de date și primiți-le înapoi pe computerul utilizatorului. Cele mai frecvente probleme de aplicare rezolvate de acest mecanism sunt stocarea informațiilor însoțitoare, de exemplu, imagini ale mărfurilor, documente legate de contracte etc.

Domeniul de aplicare al metodei

Depozitare temporara

Stocarea temporară este o zonă specializată a bazei de informații în care pot fi plasate date binare. Scopul principal este stocarea temporară a informațiilor în timpul interacțiunii client-server înainte de a fi transferate în baza de date.

Necesitatea stocării temporare apare deoarece modelul de operare al browserului web necesită ca fișierul selectat de utilizator să fie transferat direct pe server fără posibilitatea stocării acestuia pe client. Când un fișier este transferat, acesta este plasat în stocare temporară și poate fi apoi utilizat atunci când scrieți un obiect în baza de date.

Cea mai tipică sarcină a aplicației rezolvată prin stocarea temporară este furnizarea de acces la fișiere sau imagini înainte ca obiectul să fie înregistrat în baza de informații, de exemplu, sub forma unui element.

Un fișier sau date binare plasate în stocare sunt identificate printr-o adresă unică, care poate fi folosită ulterior în operațiuni de scriere, citire sau ștergere. Această adresă este dată de metode de scriere a unui fișier în stocarea temporară. O metodă separată în limbajul încorporat vă permite să determinați dacă adresa transmisă este o adresă care indică date în stocare temporară.

Baza de informatii

Mecanismul vă permite să accesați date binare stocate în atribute de tipul Value Storage.

Ca și în cazul stocării temporare, accesul la informații este posibil printr-o adresă specială. Îl puteți obține printr-o metodă specială prin transmiterea unui link către un obiect sau o cheie de intrare în registrul de informații și numele atributului. În cazul unei piese tabulare, este necesar să se transfere în plus indexul de rând al părții tabulare.

Metodele de lucru cu fișiere au limitări atunci când se lucrează cu detaliile bazei de informații. Pentru ei, spre deosebire de stocarea temporară, sunt disponibile doar informațiile de citire, dar nu scrierea sau ștergerea acestora.

Descrierea metodelor de lucru cu fișiere

Salvarea datelor în stocarea temporară

Scenariul cel mai tipic pentru utilizarea acestui mecanism implică plasarea inițială a datelor utilizatorului în stocare temporară. Există două metode pentru aceasta: PlaceFile() și PlaceFileInTemporaryStorage().

Prima metodă, PlaceFile(), plasează un fișier din sistemul de fișiere local în stocarea temporară. Metoda poate accepta o adresă țintă în stocare. Dacă nu este definit sau este un șir gol, atunci va fi creat fișier nou iar metoda își va returna adresa prin parametrul corespunzător.

Dacă parametrul care determină modul interactiv de operare este True, atunci metoda va afișa o casetă de dialog standard de selecție a fișierelor în care puteți selecta un fișier pe care să îl plasați în stocare. În acest caz, metoda va returna și adresa fișierului selectat.

Ca rezultat, metoda returnează False dacă utilizatorul a refuzat în mod interactiv să efectueze o operație în dialogul de selecție a fișierului. Metoda este disponibilă doar pentru client.

A doua metodă, PlaceFileInTemporaryStorage(), este similară cu cea anterioară, cu excepția faptului că este disponibilă pe server, iar datele care urmează să fie scrise în stocarea temporară sunt reprezentate nu ca o cale în sistemul de fișiere, ci ca o variabilă de tip BinaryData. De asemenea, dacă nu este specificată nicio adresă țintă, este creat un fișier nou în stocare. Adresa sa este returnată ca rezultat al funcției.

Preluarea unui fișier din stocarea temporară

Când scrieți un obiect în baza de informații, poate fi necesar să extrageți date din stocarea temporară și să le plasați, de exemplu, într-un atribut. Există o metodă de server corespunzătoare pentru aceasta - GetFileFromTemporaryStorage(). Această metodă preia datele din stocarea temporară și, ca rezultat, le returnează. Pentru a face acest lucru, trebuie să specificați adresa în stocarea temporară. Această adresă este returnată de metodele descrise mai sus PlaceFile() și PlaceFileInTemporaryStorage() dacă sunt executate cu succes.

Ștergerea unui fișier din stocarea temporară

După ce datele sunt salvate în detalii, fișierul din stocare temporară poate fi șters. În acest scop, există o metodă DeleteFileFromTemporaryStorage(), care șterge un fișier din stocarea temporară. Metoda ia ca parametru adresa unui fișier aflat în stocare temporară. Disponibil pe server.

Verificarea adresei pentru stocare temporară

Adresa fișierului poate indica atât stocarea temporară, cât și detalii în baza de informații. Pentru a-i verifica tipul, există o metodă This isTemporaryStorageAddress().

Verifică dacă adresa transmisă este o adresă care indică către magazin. Returnează True dacă adresa indică o stocare temporară. Metoda este disponibilă pe server.

Primirea adresei de recuzită

După ce datele sunt plasate în detaliile din baza de informații, poate fi necesar să le accesați folosind metode de fișier.

Dar înainte de a primi date, de exemplu de la o proprietate, trebuie să obțineți adresa acestei proprietăți. În acest scop, există o metodă GetFileAddressInInformationBase().

Scopul său este de a returna adresa fișierului în baza de informații conform parametrilor originali. Pentru a face acest lucru, trebuie să transmiteți cheia obiectului (aceasta poate fi fie un link către obiect, fie o cheie de intrare în registrul de informații) și numele atributului. Dacă trebuie să obțineți adresa unui fișier stocat într-un atribut al părții tabelare, înainte de numele atributului din parametrul care specifică numele atributului, trebuie să adăugați numele părții tabelare și un punct „.”. Metoda este disponibilă atât pe client, cât și pe server.

Preluarea unui fișier din baza de informații

Metoda GetFile() primește un fișier din baza de informații și îl salvează în local Sistemul de fișiere utilizator. Primul parametru specifică adresa fișierului din elementele de recuzită sau stocarea temporară a fișierului. Al doilea parametru specifică locația de destinație a fișierului rezultat. În modul non-interactiv, trebuie să specificați calea. În modul interactiv, parametrul este opțional.

Implicit, metoda este executată în modul interactiv, adică ultimul parametru este True. Aceasta înseamnă că este afișată o casetă de dialog în care puteți specifica o acțiune cu fișierul primit: rulați-l sau salvați-l într-o locație specificată de utilizator. Dacă modul interactiv este activ și parametrul Cale fișier disc țintă nu este specificat, operația de deschidere a fișierului nu este disponibilă. Returnează o valoare booleană. Fals înseamnă că utilizatorul a ales să anuleze operația în caseta de dialog interactivă de salvare a fișierului.

Exemplu de utilizare a metodelor de fișiere

// Primirea unui fișier de pe disc în modul interactiv // și plasarea acestuia în stocare temporară &Pe Procedura Client SelectDiskFileAndWrite()

Variabila SelectedName; VariableTemporaryStorageAddress; Dacă PutFile(TemporaryStorageAddress, SelectedName, True) Atunci Object.FileName = SelectedName; PlaceObjectFile(TemporaryStorageAddress); endIf;

Sfârșitul procedurii

// Copierea unui fișier din stocarea temporară într-un atribut de director //, înregistrarea unui obiect, ștergerea unui fișier din stocarea temporară // &Pe server Procedure Place Object File (Adresa de stocare temporară)

Director Element = Form AttributesValue("Obiect"); BinaryData = GetFileFromTemporaryStorage(TemporaryStorageAddress); Director Element.File Data = NewValueStorage(BinaryData); FilePathOnDisk = Fișier nou (DirectoryItem.FileName); Director Item.FileName = FilePathOnDisk.Name; Director element.Write(); Modificat = Fals; DeleteFileFromTemporaryStorage(TemporaryStorageAddress); ValueВFormAttributes(Element director, „Obiect”);

Sfârșitul procedurii

// Citirea fișierului din elemente de recuzită și salvarea lui // în disc localîn modul interactiv &Pe Procedura Client ReadFileAndSaveToDisk()

Adresă = GetFileAddressInInformationBase(Object.Link, "FileData"); GetFile(Adresă, Object.FileName, True);

Sfârșitul procedurii

Suport pentru adrese din câmpul de imagine

Controlul Picture Field acceptă afișarea unei imagini specificate de adresa unui fișier în stocarea temporară sau într-o bază de date.

Pentru a face acest lucru, trebuie să setați un atribut de tip șir în proprietatea Data a elementului de formular. Valoarea acestui atribut va fi interpretată ca adresa imaginii.

Exemplu // Legarea câmpului de imagine la adresa imaginii în // stocare temporară. AddressPictures formează detalii de tip șir

PlaceFile(Adresă imagine, adevărat)

Picture.Data = AddressPictures

Limitări atunci când lucrați cu clientul Web

Funcționarea mecanismului descris atunci când se utilizează clientul Web are unele limitări. Aceste restricții sunt legate de modelul de securitate al browserului. Deci, de exemplu, clientul nu poate salva independent un fișier în sistemul de fișiere local, adică doar versiunea interactivă a metodelor client PlaceFile() și GetFile() este disponibilă. O excepție este aruncată atunci când încercați să utilizați modul non-interactiv. Casete de dialog, afișate interactiv, sunt specifice unui anumit tip de browser.

Caracteristici atunci când lucrați cu Value Storage pe Client

Problemă:

Când un Document are un atribut de tipul de stocare a valorii în secțiunea tabelară, acesta încetinește deschiderea formularului de document dacă acest atribut conține date mari.

Motiv presupus:

Poate că, la deschiderea unui formular, nu linkul către datele aflate în Value Store este trimis către client, ci datele în sine.

Soluţie

  • În proprietăți detaliile tabelului Formularul are marcajul „Folosiți întotdeauna”. Dacă este setat, conținutul câmpului este întotdeauna transferat între server și client - de exemplu, la deschiderea unui formular. Acest flag trebuie să fie dezactivat, dar acest lucru trebuie luat în considerare în cod, deoarece implicit nu va exista nicio valoare pentru acest câmp pe client. Un exemplu poate fi găsit în 1C:Arhive.

Este chiar mai bine de folosit depozitare temporara pentru a transfera fișiere între client și server.

Imprimare (Ctrl+P)

16.3. Lucrul cu date binare

16.3.1. Informații generale

La implementare solutii aplicative Pot exista situații în care este necesară analizarea diferitelor date binare. De exemplu, trebuie să determinați tipul fișierului folosind o semnătură sau să efectuați unele manipulări cu o imagine. Pentru a lucra cu date binare, 1C:Enterprise oferă interfețe software speciale. În continuare, vom analiza posibilitățile de lucru cu date binare.
Toate lucrările cu date binare se bazează pe conceptul de flux. curgere este o generalizare logică a unei surse de date arbitrare (în caz general) (obiect Stream). Sistemul nu oferă posibilitatea de a crea un obiect Stream independent care nu este asociat cu nicio sursă. Dar există obiecte derivate care pot fi create - un flux asociat cu un fișier de pe disc (obiect FileStream) sau un flux creat în memorie (obiect MemoryStream). Un flux vă permite atât să citiți date, cât și să le scrieți. Pentru a determina posibilitatea de a efectua anumite operații, un flux (și obiecte derivate) are metode speciale care vă permit să determinați care
operațiunile sunt disponibile cu acest fir (metode Record disponibil(), DisponibilRead(), AvailableChangePosition()).
Dacă trebuie să lucrați cu un flux pentru mai mult nivel inalt, în special, pentru a citi/scrie date precum un număr (cu adâncime de biți diferită) sau un șir, atunci obiectele DataRead/DataWrite sunt destinate acestui lucru. Folosind aceste obiecte, puteți adopta o abordare mai structurată a datelor binare aflate în flux. Deci, de exemplu, cunoscând formatul unui fișier, puteți citi destul de confortabil un astfel de fișier, obținând datele necesare din anteturi (care, de regulă, sunt reprezentate de tipurile număr și șir), sărind peste blocurile de date inutile și încărcarea celor necesare procesării.
Schema generală de lucru cu date binare poate fi reprezentată după cum urmează:

  1. Primirea fluxului în curs
  2. Este creat un obiect Data Reader sau Data Writer.
  3. Folosind obiectul creat la pasul 2, sunt efectuate acțiunile necesare.
  4. Obiectul creat la pasul 2 este închis.
  5. Dacă nu mai sunt necesare operațiuni, fluxul obținut la pasul 1 este închis.
  6. Dacă doriți să continuați să lucrați cu fluxul, puteți instala Pozitie nouaîn flux (dacă această operație este acceptată) și continuați să lucrați începând cu pasul 2.

Este de remarcat faptul că este posibil să combinați paragrafele 1 și 2. Cu alte cuvinte, sistemul oferă posibilitatea de a crea obiecte Citiți date/Scrieți date direct de la, de exemplu, un obiect BinaryData.
Pentru a efectua diverse operațiuni cu date binare, sistemul oferă posibilitatea de a obține o parte din flux ca un fragment separat cu acces aleatoriu (octet cu octet) (obiect). BufferBinaryData). Dimensiunea buffer-ului este setată când este creată și nu poate fi modificată ulterior. Când lucrați cu un buffer de date binare, este posibil să lucrați cu numere de diferite adâncimi de biți ca
ca un întreg. În acest caz, este posibil să specificați ordinea octeților în cuvinte: „little endian” sau „big endian” (big endian). De asemenea, este posibil să împărțiți un buffer în mai multe și să combinați mai multe tampon de date binare într-un singur buffer rezultat.
Este important de reținut că lucrul cu un buffer de date binare poate simplifica semnificativ implementarea dacă lucrul cu date binare este implementat pe partea aplicației client în modul asincron. În acest caz, citirea datelor în buffer va fi efectuată ca o operație asincronă, iar lucrul cu datele tampon va fi sincron.
Lucrul cu date binare este disponibil pe partea client (inclusiv clientul web) a aplicației și pe partea serverului, precum și în schemele de lucru sincrone și asincrone. Alte exemple vor folosi o schemă de lucru sincronă.

16.3.2. Citirea datelor binare

Ca exemplu de citire a datelor binare, vom lua în considerare sarcina de a determina formatul corect de fișier care a fost selectat în sistem pentru utilizare ulterioară. Un fișier .wav cu date audio va fi folosit ca fișier care este verificat. Pentru a stoca fișiere .wav, se folosește Resource Interchange File Format (RIFF), a cărui descriere este dată la link-ul:

https://msdn.microsoft.com/enus/library/windows/desktop/ee415713.aspx (la Limba engleză). Pentru exemplul de citire vor fi utilizate următoarele informații de format:
1. Primii 4 octeți ai fișierului conțin identificatorul de format: RIFF.
2. următorii 4 octeți conțin dimensiunea datelor audio reale în ordinea octeților mici-endian.
3. Următorii 4 octeți conțin tipul de text al datelor utilizate: WAVE.
Pentru a efectua aceste acțiuni, veți avea nevoie de următorul cod în limbajul încorporat:

Citiți = Nou ReadData(FileName, ByteEndian.LittleEndian);
FileFormat = Read.ReadCharacters(4);
DataSize = Read.ReadInteger32();
FileType = Read.ReadCharacters(4);
Dacă File Format<>„RIFF” Atunci
Report(„Acesta nu este un fișier RIFF”);
Întoarcere ;
EndIf ;
Dacă FileType = „WAVE”, atunci
Raport („Acesta este un fișier WAV cu date, dimensiune” + DataSize + ”octeți”);
In caz contrar
Raport („Acesta nu este un fișier WAV”);
Întoarcere;
endIf;

Să ne uităm la exemplu mai detaliat.
Mai întâi, fișierul al cărui nume este conținut în variabila FileName este deschis, fișierul este deschis pentru citire ( FileOpenMode.Open), va citi doar din fișier ( FileAccess.Read) și un buffer de 16 octeți va fi folosit pentru citire.
Apoi este generat un flux pentru citirea datelor, care va avea cea mai puțin semnificativă ordine de octeți pentru datele de tip Number. Apoi 4 caractere, un număr întreg de 32 de biți și încă 4 caractere sunt citite din fluxul rezultat. Datele rezultate sunt analizate și pe baza rezultatelor analizei se ia o decizie dacă fișierul selectat este un fișier .wav sau nu.

16.3.3. Scrierea datelor binare

Scrierea datelor binare într-un fișier, în cel mai simplu caz, se face după cum urmează:

Intrare = Nou WriteData(FileName);
Pentru Index = 0 până la 255 Ciclu
Write.WriteByte(Index);
EndCycle;
Record.Close() ;

Acest exemplu scrie într-un fișier o secvență de octeți de la 0 la 255 (0xFF în hexazecimal). Aceasta este cea mai simplă opțiune de înregistrare.
De asemenea, puteți utiliza o metodă similară cu metoda de citire discutată în exemplul anterior, în care se obține un flux de fișiere și datele sunt scrise în acest flux de fișiere.

16.3.4. Lucrul cu un buffer de date binare

După cum sa menționat mai sus, tamponul de date binare oferă o modalitate convenabilă de a manipula fragmente de date binare.
Nu doar citirea datelor este acceptată, ci și scrierea.
Ca exemplu, vom lua în considerare analizarea antetului fișierului RIFF din exemplul de citire a datelor (vezi aici). Pentru a construi exemplul, vor fi folosite exact aceleași informații despre formatul fișierului. Astfel, este necesar să citiți din fișier sursă un buffer de dimensiunea antetului fișierului. Antetul este format din trei câmpuri de 4 octeți. Astfel, trebuie citiți 12 octeți.

Buffer = Nou BufferBinaryData(12);
Fișier = FileStreams.Open (Director de fișiere temporare() + „Windows Logon.wav”, FileOpenMode.Open, FileAccess.Read);
File.Read(Buffer, 0, 12);
Dimensiune = Buffer.ReadInteger32(4);
StreamString = newStreamInMemory(Buffer);
StreamRows.Go(0, PositionInStream.Start);

FileFormat = ReadLines.ReadCharacters(4, „windows-1251”);
ReadLines.Închidere();
StreamRows.Go(8, PositionInStream.Start);
RowReader = nou DataReader(RowStream);
FileType = ReadLines.ReadCharacters( 4, „windows-1251”);
ReadLines.Închidere();

Procesul de introducere a datelor într-un buffer de date binar nu este nimic special. Operațiunile ulterioare necesită câteva comentarii. Citirea numerelor de orice adâncime de biți acceptată este posibilă din orice poziție din buffer. ÎN în acest exemplu Buffer.ReadInteger32(4); înseamnă citirea unui număr întreg de 32 de biți începând de la octetul 4 al memoriei tampon. Astfel, dacă trebuie să citiți mai multe numere situate în locuri diferite în buffer, acest lucru se poate face fără poziționare directă în acel buffer.
Citirea unui șir, totuși, nu este acceptată de tamponul de date binare. Prin urmare, ar trebui să utilizați un obiect care vă permite să faceți acest lucru: Citiți date. Un obiect DataReader nu poate fi creat dintr-un buffer de date binar. Dar pe baza unui buffer de date binare, puteți crea un flux care este un intermediar universal între locația fizică de stocare a informațiilor (fișier, buffer de date binare) și un obiect de nivel înalt care vă permite să lucrați cu aceste date.
Când un obiect DataReader este creat pe baza unui flux, acesta începe să citească date din poziția în acest moment instalat în flux. Prin urmare, în exemplu, poziția în flux este mai întâi setată, apoi este creat un obiect DataReader și este citit numărul necesar de caractere. Descriere detaliata pentru diferența dintre numărul de octeți și caractere la citirea șirurilor de caractere, consultați următoarea secțiune 16.3.5

16.3.5. Caracteristici de utilizare

Când utilizați date binare, ar trebui să țineți cont de caracteristicile de lucru cu date de tip String. Particularitatea este că lungimea șirului pe care o returnează funcția de context global StrLength() este măsurată în caractere. În simboluri, ar trebui să indicați dimensiunea datelor de citit/scris în metodele de scriere/citire a șirurilor în obiecte pentru lucrul cu date binare ( CitițiCaractere(),
ReadString(), Scrie caractere(), WriteString()). Cu toate acestea, nu există o opțiune clară pentru conversia lungimii unui șir în caractere într-un parametru similar în octeți. În funcție de conținutul șirului și de codificare, acest raport va fi diferit. Prin urmare, atunci când lucrați cu orice structuri de date care includ șiruri de lungime variabilă, ar trebui să înțelegeți clar în ce unități sunt exprimate lungimile șirurilor.
Dacă în datele disponibile lungimea șirului este indicată în octeți, iar șirul este specificat într-o codificare cu lungime variabilă pe mai mulți octeți (de exemplu, UTF-8), atunci folosind obiecte de date binare, citind o astfel de structură dintr-un fișier în datele de tip String sunt în general imposibile.
Dar, în acest caz, puteți schimba cu ușurință poziția de citire/scriere în fluxul de fișiere. Dacă lungimea unui șir este specificată în caractere, atunci devine posibil să citiți un astfel de șir în date de tip String, dar devine imposibil să schimbați poziția de citire/scriere într-un astfel de flux.
Pentru a obține lungimea unui șir în octeți, puteți utiliza următoarea funcție pentru a converti șirul într-un obiect BinaryData:

Funcţie Obțineți date binare din șir(Valoare StrParameter, Codificarea valorii = „UTF-8”)
MemoryThread = NewMemoryThread;
Scriitor = Nou WriteData(StreamMemory);
Writer.Write String(StrParameter, Encoding);
Scriitor.Închidere();
Returnează StreamMemory.CloseAndGetBinaryData();
EndFunction

Dimensiunea reală în octeți poate fi obținută prin apelarea funcției Size() de pe obiectul BinaryData, care este obținută ca rezultat al funcției.
Utilizarea simultană a obiectelor nu este recomandată Citiți date/Scrieți dateși stream obiecte. Dacă între două operații succesive de citire din ReadData sau două operații succesive de scriere pe WriteData există o schimbare a poziției în fluxul cu care lucrează obiectele Ch ShadowData/WriteData– se generează o excepție. Astfel, următorul exemplu demonstrează schimbarea corectă a poziției într-un flux atunci când scrieți date într-un flux:

Flux = newStreamInMemory();

WriteData.WriteString("Salut Lume!");
WriteData.Close();
Stream.Go (0, PositionInStream.Start);
DataWrite = newDataWrite(Stream);
WriteData.WriteString("Pa!");
WriteData.Close();
Următorul exemplu salut la o excepție care este aruncată:

Flux = NewStreamInMemory();

WriteData.WriteString(„Bună ziua, lume!”);
Stream.Go(0, PositionInStream.Start);
// Următoarea linie va arunca o excepție
WriteData.WriteString(„La revedere!”);
În același timp, sunt posibile situații în care comportamentul sistemului va fi incorect, dar nu vor fi generate erori:

Flux = GetStream();
ReadData = nou ReadData(Stream);
TestString = ReadData.Read();
InitialPosition = Stream.CurrentPosition();
DataWrite = newDataWrite(Stream);
WriteData.WriteString(„Șir neașteptat”);
WriteData.Close();
Stream.Go(InitialPosition, PositionInStream.Start);
// În general, este imposibil să se determine ce valoare va fi plasată în variabila TestString2
TestLine2 = ReadData.ReadLine();

Descris în aceasta sectiune comportamentul este cauzat de o Obiectele Data Reader/Data Writer folosesc propriile buffer-uri atunci când lucrează cu un flux. Ca urmare, poziția reală a firului diferă de poziția logică, care se formează ca urmare a operațiilor finalizate.
De asemenea, nu este acceptată utilizarea simultană a obiectelor Data Reader și Data Writer, care folosesc un fir pentru munca lor.