DZWON

Są tacy, którzy czytają tę wiadomość przed wami.
Zapisz się, aby otrzymywać najnowsze artykuły.
E-mail
Imię
Nazwisko
Jak chcesz przeczytać The Bell
Bez spamu

Platforma technologiczna 1C: Enterprise 8 pozwala na zapisywanie dowolnych plików w infobase, odbieranie ich stamtąd i wykorzystywanie ich na różne sposoby. Rozważmy te operacje na przykładach.

Przed pobraniem pliku do bazy danych 1C należy uzyskać pełny adres pliku na dysku. Praca z oknami dialogowymi wyboru plików jest opisana w.

Aby przechowywać pliki, należy użyć właściwości (lub zarejestrować zasób) z typem StorageValues.

Ładowanie dowolnego pliku do bazy informacji 1C

Każdy plik można przedstawić jako dane binarne i załadować do Magazyn wartości.

Podczas konwersji danych binarnych na obiekt StorageValues konstrukcja jest używana newValueStore (dane, kompresja) z dwoma parametrami:

  1. Dane - dane binarne do przechowywania
  2. Kompresja - stopień kompresji algorytmu deflacji. Liczba całkowita z zakresu od -1 do 9. -1 to domyślny współczynnik kompresji. 0 - brak kompresji, 9 - maksymalny stopień kompresji. Wartość domyślna to -1. Parametr jest opcjonalny, jeśli nie jest określony, kompresja nie jest używana.

// Przekonwertuj plik na dane binarne
File \u003d New BinaryData (Path);

// Utwórz nowy obiekt ValueStorage

Magazyn danych \u003d Magazyn nowej wartości (plik, kompresja nowych danych (9));

Zapisywanie dowolnego pliku z bazy danych 1C na dysk

Aby zapisać plik z bazy danych 1C na dysk, musisz określić ścieżkę i nazwę pliku. Aby to zrobić, istnieje okno dialogowe zapisu pliku, którego praca jest opisana w.

// Pobierz dane binarne z pamięci
// DataStore - atrybut obiektu o typieValuesStorage

// Zapisz otrzymane dane na dysk
// Zmienna Path zawiera pełny adres pliku na dysku
Dane. Napisz (ścieżka);

Przeglądanie pliku znajdującego się w bazie danych 1C

Aby wyświetlić plik zapisany w bazie danych, na komputerze musi być zainstalowana aplikacja, która otwiera ten plik.

// Uzyskaj nazwę pliku tymczasowego z wymaganym rozszerzeniem
// W zmiennej Rozszerzenie musisz umieścić rozszerzenie pliku, na przykład „pdf”
Path \u003d GetTemporaryFileName (rozszerzenie);

// Pobierz dane z pamięci
// DataStore - atrybut obiektu o typieValuesStorage
Dane \u003d Magazyn danych. Odbierz ();

// Zapisz dane do pliku tymczasowego
Dane. Napisz (ścieżka);

// Próba otwarcia pliku w odpowiedniej aplikacji
// Jeśli aplikacja nie zostanie znaleziona, pojawi się systemowe okno dialogowe „Otwórz za pomocą ...”
LaunchApplication (Path);

Prawie każda informacja może być przechowywana w magazynie wartości, na przykład

... zdjęcia (zdjęcia):

TekImage.Object \u003d SprFabric.Link; TekImage.DataType \u003d Enumerations.Types of additional informationObjects.Image; Storage \u003d New StorageValue (New Picture, New Data Compression ()); TekImage.Storage \u003d Storage.Get ();

// w tym miejscu wyświetla wszystko ... Form Elements.PictureField1.Picture \u003d Storage.Get (); TekImage.Write ();

... dokument arkusza kalkulacyjnego:

TabDoc \u003d New TabularDocument; TabDoc.Display (Form Elements.TableDoc Field1); Przechowywanie \u003d nowe przechowywanie wartości (TabDoc); Pisać ();

Koniec procedury

Procedura Przywróć z pamięci Naciśnij (pozycja)

TabDoc \u003d Storage.Get (); Jeśli TabDoc<>Niezdefiniowane, a następnie FormElements.TableDocumentField1.Offer (TabDoc); EndIf;

Koniec procedury

... dowolne pliki (dane binarne):

HZ \u003d New Value Store (New BinaryData (plik));

Osiem obsługuje kompresję danych umieszczonych w pamięci:

HZ \u003d NewValueStore (New BinaryData (plik), NewData Compression (9));

... zewnętrzne przetwarzanie i raportowanie:

Procedura UploadProcessingIn Storage (Props StorageType)

Stopień kompresji \u003d Nowa kompresja danych (9); // maksymalnie 9 PropsStorageType \u003d NewValueStore (New BinaryData ("c: \\ reports \\ report.epf", stopień kompresji));

Koniec procedury

Procedura StartProcessingFrom Storage (Props StorageType)

TempFileName \u003d TempFileDir () + "report.epf"; BinaryData \u003d PropsTypeStorage.Get (); BinaryData.Write (TemporaryFileName); ExternalProcessing \u003d ExternalProcessing.Create (TemporaryFileName); ExternalProcessing.GetForm (). Open ();

Koniec procedury

Praca z magazynem

Jeśli był to BinaryData, można go przywrócić z magazynu wartości przy użyciu metody Get i zapisać do pliku przy użyciu metody Write ().

Jeśli TypeZnch (pamięć masowa)<> Wpisz („BinaryData”) Następnie

BinaryData \u003d Storage.Get ();

BinaryData \u003d Storage;

EndIf; BinaryData.Write (nazwa_pliku);

Jeśli był to na przykład dokument Word (plik doc lub inny plik zarejestrowanego typu), to można go otworzyć w ten sposób:

Uruchom aplikację (nazwa_pliku);

Aby wyczyścić pole typu Przechowywanie wartości, musisz przypisać je Niezdefiniowane:

Magazyn rekwizytów \u003d niezdefiniowany;

Praca z plikami i obrazami w osadzonym języku 1C: Enterprise 8

Spotkanie

Zarządzana aplikacja posiada nowy mechanizm pracy z plikami. Zapewnia wymianę plików między bazą danych a aplikacją kliencką. Osobliwością tego mechanizmu jest to, że jest on ukierunkowany na zastosowanie w cienkim kliencie i kliencie sieciowym oraz jest zaprojektowany z uwzględnieniem ograniczeń w pracy z plikami narzuconymi przez przeglądarki internetowe.

Mechanizm to zestaw metod, które można wykorzystać do umieszczenia danych przechowywanych lokalnie u użytkownika w tymczasowej pamięci bazy danych, przeniesienia tych informacji z tymczasowego magazynu do bazy danych i odzyskania ich z powrotem na komputer użytkownika. Najczęstsze zadania aplikacyjne rozwiązywane przez ten mechanizm to przechowywanie informacji towarzyszących, na przykład zdjęć towarów, dokumentów związanych z umowami itp.

Zakres metody

Tymczasowe przechowywanie

Tymczasowe przechowywanie to wyspecjalizowany obszar bazy informacji, w którym mogą być przechowywane dane binarne. Głównym celem jest tymczasowe przechowywanie informacji podczas interakcji klient-serwer do momentu ich przeniesienia do bazy danych.

Potrzeba tymczasowego przechowywania wynika z tego, że w modelu przeglądarki internetowej wymagane jest przeniesienie wybranego przez użytkownika pliku bezpośrednio na serwer bez możliwości przechowywania go na kliencie. Podczas przesyłania plik jest umieszczany w magazynie tymczasowym i dopiero wtedy można go użyć podczas zapisywania obiektu do bazy danych.

Najbardziej typowym problemem aplikacji rozwiązywanym przez tymczasowe przechowywanie jest udostępnianie plików lub obrazów przed zapisaniem obiektu do bazy danych, np. W postaci elementu.

Plik lub dane binarne umieszczone w pamięci są identyfikowane za pomocą unikalnego adresu, który można później wykorzystać w operacjach zapisu, odczytu lub usuwania. Ten adres jest nadawany przez metody zapisu pliku do tymczasowej pamięci. Oddzielna metoda w języku wbudowanym pozwala określić, czy przekazany adres jest adresem wskazującym na dane w pamięci tymczasowej.

Baza informacji

Mechanizm umożliwia dostęp do danych binarnych przechowywanych w atrybutach typu ValueStore.

Podobnie jak w przypadku tymczasowego przechowywania, dostęp do informacji można uzyskać pod specjalnym adresem. Możesz to uzyskać za pomocą specjalnej metody, przekazując referencję do obiektu lub klucza rekordu rejestru informacji oraz nazwę właściwości. W przypadku sekcji tabelarycznej dodatkowo wymagane jest przeniesienie indeksu wierszy sekcji tabelarycznej.

Metody pracy z plikami mają ograniczenia podczas pracy ze szczegółami bazy danych. Dla nich, w przeciwieństwie do tymczasowego przechowywania, dostępne jest tylko czytanie informacji, ale nie zapisywanie ich ani usuwanie.

Opis metod pracy z plikami

Zapisywanie danych do tymczasowego przechowywania

Najbardziej typowy scenariusz wykorzystania tego mechanizmu obejmuje wstępne umieszczenie danych użytkownika w tymczasowym magazynie. Istnieją dwie metody: PlaceFile () i PlaceFileToTemporaryStorage ().

Pierwsza metoda, PlaceFile (), umieszcza plik z lokalnego systemu plików w pamięci tymczasowej. Metoda może przyjąć docelowy adres w sklepie. Jeśli nie jest zdefiniowany lub jest pustym ciągiem, zostanie utworzony nowy plik, a metoda zwróci swój adres za pomocą odpowiedniego parametru.

Jeśli parametr definiujący interaktywny tryb działania ma wartość True, to metoda wyświetli standardowe okno dialogowe wyboru pliku, w którym można wybrać plik, który ma zostać umieszczony w pamięci. W takim przypadku metoda zwróci również adres wybranego pliku.

W rezultacie metoda zwraca False, jeśli użytkownik w trybie interaktywnym odmówił wykonania operacji w oknie dialogowym wyboru pliku. Metoda jest dostępna tylko u klienta.

Druga metoda, PutFileToTemporaryStorage (), jest podobna do poprzedniej, z tą różnicą, że jest dostępna na serwerze, a dane do zapisania w magazynie tymczasowym nie są reprezentowane jako ścieżka w systemie plików, ale jako zmienna BinaryData. Podobnie, jeśli nie określono adresu docelowego, w repozytorium tworzony jest nowy plik. W wyniku funkcji zwracany jest jego adres.

Pobieranie pliku z magazynu tymczasowego

Podczas zapisywania obiektu w bazie danych może być konieczne pobranie danych z tymczasowego magazynu i umieszczenie ich, na przykład, w rekwizytach. W tym celu istnieje odpowiednia metoda serwera - GetFileFrom TemporaryStorage (). Ta metoda pobiera dane z pamięci tymczasowej i zwraca je jako wynik. Aby to zrobić, musisz podać adres w magazynie tymczasowym. Ten adres jest zwracany przez powyższe metody PlaceFile () i PlaceFileTemporaryStorage (), jeśli się powiedzie.

Usuwanie pliku z magazynu tymczasowego

Po zapisaniu danych w rekwizytach plik z tymczasowego magazynu można usunąć. Aby to zrobić, istnieje metoda DeleteFileFrom TemporaryStorage (), która usuwa plik z tymczasowego magazynu. Metoda przyjmuje parametr adres pliku w pamięci tymczasowej. Dostępne na serwerze.

Sprawdzenie adresu pod kątem przynależności do czasowego składowania

Adres pliku może wskazywać zarówno na tymczasową pamięć masową, jak i zmienną bazy danych. Aby sprawdzić jego typ, istnieje metoda ThisTemporaryStorageAddress ().

Sprawdza, czy podany adres jest adresem wskazującym na sklep. Zwraca wartość True, jeśli adres wskazuje na tymczasową pamięć. Metoda jest dostępna na serwerze.

Zdobycie adresu rekwizytów

Po umieszczeniu danych w rekwizytach w infobase może być konieczne uzyskanie do nich dostępu za pomocą metod plikowych.

Ale zanim pobierzesz dane, na przykład z rekwizytów, musisz uzyskać adres tych rekwizytów. Aby to zrobić, istnieje metoda o nazwie GetFileAddressVInformationBase ().

Jego celem jest zwrócenie adresu pliku w infobase zgodnie z oryginalnymi parametrami. Aby to zrobić, musisz przekazać klucz obiektu (może to być odwołanie do obiektu lub klucz do rekordu rejestru informacji) i nazwę zmiennej. Jeśli potrzebujesz uzyskać adres pliku przechowywanego w atrybucie sekcji tabelarycznej, przed nazwą atrybutu w parametrze określającym nazwę atrybutu, musisz dodać nazwę sekcji tabelarycznej i kropkę „.”. Metoda jest dostępna zarówno na kliencie, jak i na serwerze.

Pobieranie pliku z bazy danych

Metoda GetFile () pobiera plik z bazy danych i zapisuje go w lokalnym systemie plików użytkownika. Pierwszy parametr określa adres pliku we właściwościach lub w tymczasowym miejscu przechowywania plików. Drugi parametr określa lokalizację docelową pliku wynikowego. W trybie nieinteraktywnym należy określić ścieżkę. W trybie interaktywnym parametr jest opcjonalny.

Domyślnie metoda jest wykonywana interaktywnie, czyli ostatnim parametrem jest True. Oznacza to, że wyświetlane jest okno dialogowe, w którym można określić akcję z plikiem wynikowym: uruchomić go lub zapisać w lokalizacji określonej przez użytkownika. Jeśli tryb interaktywny jest aktywny i parametr Docelowa ścieżka do pliku na dysku nie jest określony, operacja otwierania pliku nie jest dostępna. Zwraca wartość logiczną. Fałsz oznacza, że \u200b\u200bużytkownik zdecydował się anulować operację w oknie dialogowym zapisywania pliku online.

Przykład użycia metod plikowych

// Pobierz plik online z dysku // i umieść go w tymczasowym magazynie & Na kliencie Procedura SelectSDiskFileUsewrite ()

Variable SelectedName; Zmienny adres tymczasowego składowania; Jeśli PutFile (TemporaryStorage Address, SelectedName, True) Then Object.FileName \u003d SelectedName; PlaceObjectFile (TemporaryStorageAddress); EndIf;

Koniec procedury

// Kopiowanie pliku z tymczasowego magazynu do // właściwości katalogu, nagrywanie obiektu, usuwanie pliku z tymczasowego // magazynu & Procedura OnServer PlaceObjectFile (TemporaryStorage Address)

DirectoryElement \u003d FormInValue ("Obiekt"); BinaryData \u003d GetFileFrom TemporaryStorage (TemporaryStorage Address); DirectoryElement.FileData \u003d NewValueStore (BinaryData); FileDiskPath \u003d Nowy plik (DirectoryElement.FileName); DirectoryElement.FileName \u003d FilePathNaDisk.Name; DirectoryElement.Write (); Modyfikacja \u003d Fałsz; DeleteFileFrom TemporaryStorage (TemporaryStorage Address); ValueVFormAttribute (DirectoryElement, "Object");

Koniec procedury

// Przeczytaj plik z właściwości i zapisz go // na dysku lokalnym w trybie interaktywnym & W procedurze klienta ReadFile AND Save OnDisk ()

Address \u003d GetAddressFileInInformationBase (Object.Link, "FileData"); GetFile (Address, Object.FileName, True);

Koniec procedury

Obsługa adresów w polu obrazu

Kontrolka pola Obraz obsługuje wyświetlanie obrazu określonego przez adres pliku w pamięci tymczasowej lub w bazie danych.

Aby to zrobić, we właściwości Data elementu formularza należy określić atrybut typu łańcuchowego. Wartość tej zmiennej będzie interpretowana jako adres obrazka.

Przykład // Powiązanie pola obrazu z adresem obrazu w tymczasowym // miejscu przechowywania. AddressPictures formularz atrybut typu string

PlaceFile (ImageAddress, True)

Image.Data \u003d ImageAddress

Ograniczenia podczas pracy z klientem WWW

Działanie opisanego mechanizmu podczas korzystania z klienta WWW ma pewne ograniczenia. Te ograniczenia są związane ze specyfiką modelu bezpieczeństwa przeglądarki. Na przykład klient nie może samodzielnie zapisać pliku w lokalnym systemie plików, co oznacza, że \u200b\u200bdostępna jest tylko interaktywna wersja metod klienta PlaceFile () i GetFile (). Podczas próby użycia trybu nieinteraktywnego zgłaszany jest wyjątek. Okna dialogowe wyświetlane w trybie interaktywnym są specyficzne dla określonego typu przeglądarki.

Funkcje podczas pracy ze Sklepem Wartości u Klienta

Problem:

Gdy dokument w sekcji tabelarycznej ma atrybut typu ValueStorage, spowalnia to otwieranie formularza dokumentu, jeśli ten atrybut zawiera duże dane.

Przypuszczalny powód:

Być może podczas otwierania formularza klient nie otrzymuje linku do danych przechowywanych w Sklepie Wartości, ale same dane.

Decyzja

  • We właściwościach atrybutu tabeli formularza znajduje się flaga „Zawsze używaj”. Jeśli jest ustawiona, to zawartość pola jest zawsze przekazywana między serwerem a klientem - na przykład podczas otwierania formularza. Ta flaga musi być wyłączona, ale musisz wziąć to pod uwagę w kodzie, ponieważ domyślnie wartość tego pola nie będzie na kliencie. Przykład można obejrzeć w 1C: Archive.

Jeszcze lepiej, użyj tymczasowe przechowywanie do przesyłania plików między klientem a serwerem.

Dane binarne w 1C są przeznaczone do przechowywania plików o dowolnym formacie. Z ich pomocą możesz:

  • Organizuj interakcje za pomocą protokołu binarnego z różnymi urządzeniami;
  • Przechowuj pliki w dowolnym formacie jako atrybut obiektu metadanych;
  • Konwertuj dane tekstowe na binarne (najczęściej używane do wysyłania raportów);
  • Pracuj z danymi binarnymi w pamięci.

Co potrafi system

Podczas pracy z danymi binarnymi platforma 8.3 jest w stanie wykonać następujące czynności:

  1. Odczyt i zapis danych binarnych;
  2. Przenoszenie danych z klienta na serwer iz powrotem przy użyciu tymczasowego magazynu;
  3. Zainicjuj obiekt typu „Picture” za pomocą plików binarnych;
  4. Przeczytaj je z sieci WWW, korzystając z obiektów „Post Attachment”, „NTTRC Connection” itp.
  5. Używaj narzędzi kryptograficznych do szyfrowania i podpisywania ważnych załączników;
  6. Oblicz funkcję skrótu za pomocą obiektu Data Hash.

Zapisywanie danych do rekwizytów

Na przykład utwórzmy odniesienie w konfiguracji testowej.

W rzeczywistości używanie tego samego katalogu do przechowywania informacji o nomenklaturze i danych binarnych obrazów jest trochę błędne. Przy dostatecznie dużej ilości danych i ciężkich plikach o dużym rozmiarze mogą wystąpić niepożądane przestoje i „przerwy” w działaniu systemu. O wiele bardziej poprawne z punktu widzenia systemu byłoby zorganizowanie osobnej książki informacyjnej „Obrazy”, do której link moglibyśmy ustawić jako rodzaj atrybutu.


Należy zwrócić uwagę, że ze względu na to, iż atrybuty typu „ValueStore” zawierające dane binarne nie są dostępne w trybie aplikacji zarządzanej, dostęp do nich możliwy jest jedynie przy pomocy metody FormAttributeValue.


Pole komunikatu reprezentuje binarny rekord danych magazynu wartości.

Odczytywanie danych z rekwizytów

Stwórzmy przetwarzanie, które wyprowadzi plik zapisany w postaci binarnej w naszej konfiguracji do arkusza kalkulacyjnego (jest to konieczne np. Do wydrukowania logo firmy).


Zasadniczo to cały kod, którego potrzebujemy. Za pomocą operatora Get () odczytujemy dane binarne zapisane w odpowiednim atrybucie referencyjnym i przenosimy je do obiektu „Picture”, który zostanie pokazany w lewej górnej komórce dokumentu arkusza kalkulacyjnego formularza (Rys. 9).

Ryc.9

Transformacja danych

Nie zdarza się to często, ale zdarza się, że przy pracy z niestandardowymi centralami z systemami zewnętrznymi wymagana jest konwersja danych z formatu binarnego do formatu Base64 lub odwrotnie.

W większości przypadków sama platforma przekształca dane, jeśli tak się nie stanie, należy skorzystać z funkcji globalnego tłumaczenia:

  1. Base64String - tłumaczy podaną wartość na ciąg odpowiedniego kodowania;
  2. Wartość Base64 - wykonuje konwersję odwrotną.

Optymalizacja powyższego kodu

Kod pokazany na rys. 4 z pewnością działa, ale z jednym ważnym zastrzeżeniem: jeśli we właściwościach konfiguracyjnych jest zaznaczone pole wyboru „Tryb użycia modalności” (rys. 10). W przeciwnym razie użycie go spowoduje błąd.
Ryc.10

Aby temu zapobiec, będąc w module w postaci elementu referencyjnego przejdź do menu Tekst-\u003e Refaktoryzacja-\u003e Przestarzałe wywołania synchroniczne-\u003e Konwertuj wywołania modułu.

Po pewnym czasie wywołania synchroniczne zostaną automatycznie przekonwertowane na asynchroniczne, a kod przyjmie postać (Rys.11)

Ryc.11

Drukuj (Ctrl + P)

16.3. Praca z danymi binarnymi

16.3.1. informacje ogólne

Przy wdrażaniu zastosowanych rozwiązań możliwe są sytuacje, w których konieczna jest analiza różnych danych binarnych. Na przykład wymagane jest określenie typu pliku na podstawie podpisu lub wykonanie pewnych manipulacji na obrazie. Aby pracować z danymi binarnymi, 1C: Enterprise zapewnia specjalne interfejsy oprogramowania. Następnie rozważymy możliwości pracy z danymi binarnymi.
Cała praca z danymi binarnymi opiera się na koncepcji strumienia. Pływ Jest logicznym uogólnieniem dowolnego (w ogólnym przypadku) źródła danych (obiektu Stream). System nie daje możliwości stworzenia niezależnego obiektu Stream, który nie jest powiązany z żadnym źródłem. Istnieją jednak obiekty pochodne, które można utworzyć - strumień skojarzony z plikiem na dysku (obiekt FileStream) lub strumień utworzony w pamięci (obiekt MemoryStream). Strumień umożliwia zarówno odczyt, jak i zapis danych. Aby określić możliwość wykonania określonych operacji, strumień (i obiekty pochodne) mają specjalne metody, które pozwalają określić, które
operacje są dostępne na tym strumieniu (Methods AvailableRecord (), DostępneCzytaj (), AvailableChangePosition ()).
Jeżeli zachodzi potrzeba pracy ze strumieniem na wyższym poziomie, w szczególności do odczytu / zapisu danych, takich jak liczba (o różnej szerokości bitowej) lub ciąg znaków, to do tego służą obiekty ReadData / WriteData. Za pomocą tych obiektów można podejść do danych binarnych znajdujących się w strumieniu w bardziej ustrukturyzowany sposób. Na przykład znając format pliku można dość wygodnie odczytać taki plik, uzyskując niezbędne dane z nagłówków (które z reguły są reprezentowane przez liczbę i typy ciągów), pomijając niepotrzebne bloki danych i ładując dane niezbędne do przetwarzania.
Ogólny schemat pracy z danymi binarnymi można przedstawić w następujący sposób:

  1. Odbieranie strumienia
  2. Tworzony jest obiekt DataReader lub DataWrite.
  3. Przy pomocy obiektu utworzonego w kroku 2 wykonywane są wymagane czynności.
  4. Obiekt utworzony w kroku 2 zostaje zamknięty.
  5. Jeśli więcej operacji nie jest wymagane, strumień otrzymany w etapie 1 jest zamykany.
  6. Jeśli chcesz kontynuować pracę ze strumieniem, możesz ustawić nową pozycję w strumieniu (jeśli ta operacja jest obsługiwana) i kontynuować pracę od kroku 2.

Należy zauważyć, że możliwe jest łączenie punktów 1 i 2. Innymi słowy, system zapewnia możliwość tworzenia obiektów ReadData / WriteData bezpośrednio z, na przykład, obiektu BinaryData.
Aby wykonać różne operacje na danych binarnych, system zapewnia możliwość uzyskania części strumienia jako oddzielnego fragmentu z losowym (bajtowym) dostępem (obiekt BufferBinaryData). Rozmiar bufora jest ustawiany podczas tworzenia i nie można go później zmienić. Podczas pracy z binarnym buforem danych można pracować z liczbami o różnych rozmiarach bitów, jak w przypadku
jako całość. W tym przypadku można określić kolejność bajtów słowami: „little endian” lub „big endian”. Możliwe jest również podzielenie jednego bufora na kilka i połączenie wielu buforów danych binarnych w jeden wynikowy bufor.
Należy zauważyć, że praca z binarnym buforem danych może znacznie uprościć implementację w przypadku, gdy praca z danymi binarnymi jest realizowana po stronie aplikacji klienckiej w trybie asynchronicznym. W takim przypadku odczyt danych do bufora będzie wykonywany asynchronicznie, a praca z danymi w buforze jest synchroniczna.
Praca z danymi binarnymi możliwa jest po stronie klienta (w tym klienta WWW) oraz po stronie serwera, a także w schematach synchronicznych i asynchronicznych. Dalsze przykłady wykorzystają synchroniczny schemat pracy.

16.3.2. Czytanie danych binarnych

Jako przykład odczytu danych binarnych rozważymy problem określenia prawidłowego formatu pliku, który został wybrany w systemie do dalszego wykorzystania. Plik .wav z danymi audio zostanie użyty jako plik do sprawdzenia. Do przechowywania plików .wav używany jest format plików wymiany zasobów (RIFF), którego opis podano tutaj:

https://msdn.microsoft.com/enus/library/windows/desktop/ee415713.aspx (w języku angielskim). W przykładzie odczytu zostaną użyte następujące dane formatu:
1. pierwsze 4 bajty pliku zawierają identyfikator formatu: RIFF.
2. następne 4 bajty zawierają rozmiar rzeczywistych danych audio w kolejności bajtów little-endian.
3. następne 4 bajty zawierają tekstowy typ użytych danych: WAVE.
Aby wykonać te kroki, potrzebujesz następującego kodu osadzonego:

Reading \u003d New ReadData (FileName, Byte Order.LittleEndian);
Format pliku \u003d Czytaj, czytaj symbole(4);
Rozmiar danych \u003d Read.ReadInteger32();
File Type \u003d Read.ReadSymbols(4);
Jeśli format pliku<> „RIFF” Następnie
Raport („To nie jest plik RIFF”);
Zwrot;
EndIf;
Jeśli FileType \u003d „WAVE” To
Raport („To jest plik WAV z danymi, rozmiar” + DataSize + „bajty”);
Inaczej
Raport („To nie jest plik WAV”);
Powrót;
EndIf;

Rozważmy bardziej szczegółowo przykład.
Najpierw otwierany jest plik, którego nazwa jest zawarta w zmiennej FileName, plik jest otwierany do odczytu ( Tryb otwierania plików.), będą czytać tylko z pliku ( Dostęp do plików Czytaj), a do odczytu zostanie użyty bufor 16-bajtowy.
Następnie tworzony jest strumień przeznaczony do odczytu danych, które będą w najmniej znaczącej kolejności bajtów dla danych typu Number. Następnie z otrzymanego strumienia odczytywane są 4 znaki, 32-bitowa liczba całkowita i 4 dodatkowe znaki. Uzyskane dane są analizowane i na podstawie wyników analizy podejmowana jest decyzja, czy wybrany plik jest plikiem wav, czy nie.

16.3.3. Zapisywanie danych binarnych

Zapisywanie danych binarnych do pliku, w najprostszym przypadku, odbywa się w następujący sposób:

Entry \u003d New Rekord danych (nazwa pliku);
Dla indeksu \u003d 0 do 255 cykli
Write.WriteByte (indeks);
Koniec cyklu;
Record.Close ();

Ten przykład zapisuje do pliku sekwencję bajtów od 0 do 255 (0xFF w zapisie szesnastkowym). To najprostsza opcja nagrywania.
Można również użyć metody podobnej do metody odczytu opisanej w poprzednim przykładzie, gdy odbierany jest strumień pliku, a dane są zapisywane w tym strumieniu pliku.

16.3.4. Praca z binarnym buforem danych

Jak wspomniano powyżej, binarny bufor danych zapewnia wygodny sposób manipulowania fragmentami danych binarnych.
Obsługiwany jest nie tylko odczyt danych, ale także zapis.
Jako przykład rozważymy przeanalizowanie nagłówka pliku RIFF z przykładu odczytu danych (patrz tutaj). Aby zbudować przykład, zostaną użyte dokładnie te same informacje o formacie pliku. Dlatego konieczne jest odczytanie przez bufor rozmiaru nagłówka pliku z pliku źródłowego. Nagłówek składa się z trzech 4-bajtowych pól. Dlatego należy odczytać 12 bajtów.

Bufor \u003d nowy BufferBinaryData(12);
Plik \u003d FileStreams.Open (katalog TempFile() + „Windows Logon.wav”, Tryb otwierania plików., Dostęp do plików Czytaj);
File.Read (Buffer, 0, 12);
Rozmiar \u003d Buffer.ReadInteger32(4);
LineStream \u003d NewStreamInMemory (bufor);
StreamStrings.Go(0, PositionInStream.Start);

Format pliku \u003d ReadStrings.ReadSymbols(4, „windows-1251”);
ReadLines.Close();
StreamStrings.Go(8, PositionInStream.Start);
LineReader \u003d NewDataReader (LineStream);
Typ pliku \u003d ReadStrings.ReadCharacters (4, „windows-1251”);
ReadLines.Close();

Proces pobierania danych do binarnego bufora danych nie jest niczym specjalnym. Dalsze operacje wymagają komentarza. Odczyt numerów o dowolnej obsługiwanej szerokości bitowej jest możliwy z dowolnej pozycji w buforze. W tym przykładzie Buffer.ReadInteger32 (4); oznacza odczyt 32-bitowej liczby całkowitej zaczynającej się od 4 bajtów bufora. Tak więc, jeśli wymagane jest odczytanie kilku liczb znajdujących się w różnych miejscach w buforze, można to zrobić bez bezpośredniego pozycjonowania w tym buforze.
Odczyt łańcucha nie jest jednak obsługiwany przez bufor danych binarnych. Dlatego powinieneś użyć obiektu, który pozwala to zrobić: Odczyt danych. Nie można utworzyć obiektu DataReader na podstawie binarnego buforu danych. Jednak w oparciu o binarny bufor danych można utworzyć strumień, który jest uniwersalnym pośrednikiem między fizycznym miejscem przechowywania informacji (plik, binarny bufor danych) a obiektem wysokiego poziomu, który umożliwia pracę z tymi danymi.
Gdy obiekt DataReader jest tworzony na podstawie strumienia, rozpoczyna odczytywanie danych z pozycji, która jest aktualnie ustawiona w strumieniu. Dlatego w przykładzie najpierw ustawiana jest pozycja w strumieniu, a następnie tworzony jest obiekt DataReader i odczytywana jest wymagana liczba znaków. Szczegółowy opis różnicy między liczbą bajtów i znaków podczas odczytywania łańcuchów znajduje się w następnej sekcji 16.3.5

16.3.5. Funkcje użytkowania

Korzystając z danych binarnych należy wziąć pod uwagę specyfikę pracy z danymi typu String. Osobliwością jest to, że długość łańcucha zwracanego przez globalną funkcję kontekstową StrLength () jest mierzona w znakach. Symbole powinny wskazywać rozmiary danych do odczytu / zapisu w metodach zapisu / odczytu wierszy w obiektach do pracy z danymi binarnymi ( Przeczytaj symbole (),
ReadString (), WriteSymbols (), WriteString ()). Jednak nie ma jednoznacznej opcji konwersji długości ciągu znaków w znakach na podobny parametr w bajtach. W zależności od zawartości ciągu i kodowania stosunek ten będzie różny. Dlatego podczas pracy z dowolnymi strukturami danych, które zawierają ciągi o zmiennej długości, należy jasno zrozumieć, w jakich jednostkach wyrażane są długości ciągów.
Jeśli w dostępnych danych długość łańcucha jest podana w bajtach, a łańcuch jest określony w wielobajtowym kodowaniu o zmiennej długości (na przykład UTF-8), to przy użyciu obiektów do pracy z danymi binarnymi z reguły nie jest możliwe wczytanie takiej struktury z pliku do danych typu String.
Ale w tym przypadku możesz łatwo zmienić pozycję odczytu / zapisu w strumieniu plików. Jeżeli długość łańcucha jest określona w znakach, to możliwe staje się wczytanie takiego ciągu do danych typu String, ale zmiana pozycji odczytu / zapisu w takim strumieniu staje się niemożliwa.
Aby uzyskać długość ciągu w bajtach, możesz użyć następującej funkcji, aby przekonwertować ciąg na obiekt BinaryData:

Funkcjonować GetBinaryDataFromString(Wartość StrParameter, kodowanie wartości \u003d „UTF-8”)
Strumień pamięci \u003d nowy strumień pamięci;
Writer \u003d nowy Zapis danych (strumień pamięci);
Writer.WriteString(StrParameter, kodowanie);
Pisarz Zamknij();
Zwróć StreamMemory.Close & GetBinaryData();
EndFunction

Rzeczywisty rozmiar w bajtach można uzyskać, wywołując funkcję Size () w obiekcie BinaryData, która jest uzyskiwana w wyniku działania funkcji.
Nie zaleca się jednoczesnego używania obiektów ReadData / WriteData i obiektów strumieniowych. Jeśli między dwiema sekwencyjnymi operacjami odczytu z ReadData lub dwiema sekwencyjnymi operacjami zapisu do WriteData następuje zmiana pozycji w strumieniu, z którymi obiekty H przesyłanie danych / zapis danych - rzucany jest wyjątek. Tak więc poniższy przykład demonstruje poprawną zmianę pozycji w strumieniu podczas zapisywania danych w strumieniu:

Stream \u003d New StreamInMemory ();

WriteData.WriteString("Witaj świecie!");
Rejestracja danych Zamknij();
Stream.Go (0; PositionInStream.Start);
Data Record \u003d Nowy rekord danych (strumień);
WriteData.WriteString("Aż do!");
Rejestracja danych Zamknij();
Poniższy przykład hi zgłosił wyjątek:

Stream \u003d New StreamInMemory ();

WriteData.WriteStrok ("Witaj świecie!");
Stream.Go (0, PositionInStream.Start);
// Następna linia zgłosi wyjątek
WriteData.WriteString („Do widzenia!”);
Jednocześnie możliwe są sytuacje, gdy zachowanie systemu będzie nieprawidłowe, ale nie będą generowane żadne błędy:

Stream \u003d GetStream ();
ReadData \u003d New ReadData (Stream);
TestString \u003d ReadData.Read ();
SourcePosition \u003d Stream.CurrentPosition ();
Data Record \u003d Nowy rekord danych (strumień);
WriteData.WriteStrok ("Nieoczekiwany ciąg znaków");
Zapis danych.Close ();
Stream.Go (OriginPosition, PositionInStream.Start);
// Generalnie nie można określić, jaka wartość zostanie umieszczona w zmiennej TestString2
TestString2 \u003d ReadData.ReadString ();

Zachowanie opisane w tej sekcji jest spowodowane przez o obiekty ReadData / WriteData używają własnych buforów podczas pracy ze strumieniem. W efekcie rzeczywiste położenie przepływu różni się od położenia logicznego, które powstaje w wyniku przeprowadzonych operacji.
Nie jest również obsługiwane jednoczesne używanie obiektów odczytu danych i zapisów danych, które używają jednego wątku do swojej pracy.

DZWON

Są tacy, którzy czytają tę wiadomość przed wami.
Zapisz się, aby otrzymywać najnowsze artykuły.
E-mail
Imię
Nazwisko
Jak chcesz przeczytać The Bell
Bez spamu