Język

FileRecordSequence.Append Metoda

Definicja

Zapisuje rekord dziennika w pliku FileRecordSequence.

Przeciążenia

Nazwa Opis
Append(ArraySegment<Byte>, SequenceNumber, SequenceNumber, RecordAppendOptions)

Zapisuje rekord dziennika w pliku FileRecordSequence. Nie można dziedziczyć tej metody.

Append(IList<ArraySegment<Byte>>, SequenceNumber, SequenceNumber, RecordAppendOptions)

Zapisuje rekord dziennika w pliku FileRecordSequence. Nie można dziedziczyć tej metody.

Append(ArraySegment<Byte>, SequenceNumber, SequenceNumber, RecordAppendOptions, ReservationCollection)

Zapisuje rekord dziennika w FileRecordSequenceobiekcie przy użyciu spacji zarezerwowanej wcześniej w sekwencji. Nie można dziedziczyć tej metody.

Append(IList<ArraySegment<Byte>>, SequenceNumber, SequenceNumber, RecordAppendOptions, ReservationCollection)

Zapisuje rekord dziennika w FileRecordSequenceobiekcie przy użyciu spacji zarezerwowanej wcześniej w sekwencji. Nie można dziedziczyć tej metody.

Przykłady

Poniższy przykład tworzy sekwencję rekordów, dołącza do niego rekord, a na koniec odczytuje rekordy.


using System;
using System.IO;
using System.IO.Log;
using System.Collections.Generic;
using System.Text;

namespace MyFileRecordSequence
{

class ReadRecordsSample
{
    static SequenceNumber AppendRecord(IRecordSequence sequence, string message, SequenceNumber user, SequenceNumber previous)
    {
        MemoryStream data = new MemoryStream();
        BinaryWriter writer = new BinaryWriter(data);
        writer.Write(message); ArraySegment<byte>[] segments;
        segments = new ArraySegment<byte>[1];
        segments[0] = new ArraySegment<byte>(data.GetBuffer(), 0, (int)data.Length);
        return sequence.Append(segments, user, previous,RecordAppendOptions.None);
    }
    public static void Main(string[] args)
    {
        IRecordSequence sequence;
        sequence = new FileRecordSequence(args[0]);
        SequenceNumber a, b, c, d;
        a = AppendRecord(sequence, "This is record A", SequenceNumber.Invalid, SequenceNumber.Invalid);
        Console.WriteLine("Record A has sequence number System.IO.Log", a);
        b = AppendRecord(sequence, "This is record B", a, a);
        Console.WriteLine("Record B has sequence number System.IO.Log", b);
        c = AppendRecord(sequence, "This is record C", a, a);
        Console.WriteLine("Record C has sequence number System.IO.Log", c);
        d = AppendRecord(sequence, "This is record D", b, c);
        Console.WriteLine("Record D has sequence number System.IO.Log", d);
        foreach(LogRecord record in sequence.ReadLogRecords(a,LogRecordEnumeratorType.Next))
        {
            BinaryReader reader = new BinaryReader(record.Data);
            Console.WriteLine("System.IO.Log: T:System.IO.Log.IRecordSequence", record.SequenceNumber, reader.ReadString());
        }
        foreach(LogRecord record in sequence.ReadLogRecords(d, LogRecordEnumeratorType.User))
        {
            BinaryReader reader = new BinaryReader(record.Data);
            Console.WriteLine("System.IO.Log: T:System.IO.Log.IRecordSequence", record.SequenceNumber, reader.ReadString());
        }
        foreach(LogRecord record in sequence.ReadLogRecords(d, LogRecordEnumeratorType.Previous))
        {
            BinaryReader reader = new BinaryReader(record.Data);
            Console.WriteLine("System.IO.Log: T:System.IO.Log.IRecordSequence", record.SequenceNumber, reader.ReadString());
        }
    }
}
Imports System.IO
Imports System.IO.Log
Imports System.Collections.Generic
Imports System.Text


Namespace MyFileRecordSequence


Friend Class ReadRecordsSample
    Private Shared Function AppendRecord(ByVal sequence As IRecordSequence, ByVal message As String, ByVal user As SequenceNumber, ByVal previous As SequenceNumber) As SequenceNumber
        Dim data As New MemoryStream()
        Dim writer As New BinaryWriter(data)
        writer.Write(message)
        Dim segments() As ArraySegment(Of Byte)
        segments = New ArraySegment(Of Byte)(0){}
        segments(0) = New ArraySegment(Of Byte)(data.GetBuffer(), 0, CInt(Fix(data.Length)))
        Return sequence.Append(segments, user, previous,RecordAppendOptions.None)
    End Function
    Public Shared Sub Main(ByVal args() As String)
        Dim sequence As IRecordSequence
        sequence = New FileRecordSequence(args(0))
        Dim a, b, c, d As SequenceNumber
        a = AppendRecord(sequence, "This is record A", SequenceNumber.Invalid, SequenceNumber.Invalid)
        Console.WriteLine("Record A has sequence number System.IO.Log", a)
        b = AppendRecord(sequence, "This is record B", a, a)
        Console.WriteLine("Record B has sequence number System.IO.Log", b)
        c = AppendRecord(sequence, "This is record C", a, a)
        Console.WriteLine("Record C has sequence number System.IO.Log", c)
        d = AppendRecord(sequence, "This is record D", b, c)
        Console.WriteLine("Record D has sequence number System.IO.Log", d)
            For Each record In sequence.ReadLogRecords(a, LogRecordEnumeratorType.Next)
                Dim reader As New BinaryReader(record.Data)
                Console.WriteLine("System.IO.Log: T:System.IO.Log.IRecordSequence", record.SequenceNumber, reader.ReadString())
            Next record
            For Each record In sequence.ReadLogRecords(d, LogRecordEnumeratorType.User)
                Dim reader As New BinaryReader(record.Data)
                Console.WriteLine("System.IO.Log: T:System.IO.Log.IRecordSequence", record.SequenceNumber, reader.ReadString())
            Next record
            For Each record In sequence.ReadLogRecords(d, LogRecordEnumeratorType.Previous)
                Dim reader As New BinaryReader(record.Data)
                Console.WriteLine("System.IO.Log: T:System.IO.Log.IRecordSequence", record.SequenceNumber, reader.ReadString())
            Next record
    End Sub
End Class

Append(ArraySegment<Byte>, SequenceNumber, SequenceNumber, RecordAppendOptions)

Zapisuje rekord dziennika w pliku FileRecordSequence. Nie można dziedziczyć tej metody.

public:
 virtual System::IO::Log::SequenceNumber Append(ArraySegment<System::Byte> data, System::IO::Log::SequenceNumber nextUndoRecord, System::IO::Log::SequenceNumber previousRecord, System::IO::Log::RecordAppendOptions recordAppendOptions);
public System.IO.Log.SequenceNumber Append(ArraySegment<byte> data, System.IO.Log.SequenceNumber nextUndoRecord, System.IO.Log.SequenceNumber previousRecord, System.IO.Log.RecordAppendOptions recordAppendOptions);
abstract member Append : ArraySegment<byte> * System.IO.Log.SequenceNumber * System.IO.Log.SequenceNumber * System.IO.Log.RecordAppendOptions -> System.IO.Log.SequenceNumber
override this.Append : ArraySegment<byte> * System.IO.Log.SequenceNumber * System.IO.Log.SequenceNumber * System.IO.Log.RecordAppendOptions -> System.IO.Log.SequenceNumber
Public Function Append (data As ArraySegment(Of Byte), nextUndoRecord As SequenceNumber, previousRecord As SequenceNumber, recordAppendOptions As RecordAppendOptions) As SequenceNumber

Parametry

data
ArraySegment<Byte>

Lista segmentów tablic bajtowych, które będą łączone i dołączane jako rekord.

nextUndoRecord
SequenceNumber

Numer sekwencji następnego rekordu w określonej przez użytkownika kolejności.

previousRecord
SequenceNumber

Numer sekwencji następnego rekordu w poprzedniej kolejności.

recordAppendOptions
RecordAppendOptions

Prawidłowa wartość określa sposób zapisywania RecordAppendOptions danych.

Zwraca

Numer sekwencji dołączonego rekordu dziennika.

Implementuje

Wyjątki

Co najmniej jeden argument to null.

Co najmniej jeden argument jest poza zakresem.

Nie można wykonać operacji, ponieważ sekwencja rekordów została otwarta z dostępem tylko do odczytu.

Nie można wykonać żądania z powodu nieoczekiwanego wyjątku we/wy.

Metoda została wywołana po usunięciu sekwencji.

Za mało pamięci, aby kontynuować wykonywanie programu.

Sekwencja rekordów jest pełna.

Przykłady

Poniższy przykład tworzy sekwencję rekordów, dołącza do niego rekord, a na koniec odczytuje rekordy.

using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.IO.Log;

namespace MyFileRecordSequence
{
    public class MyLog
    {
        string logName = "test.log";
        FileRecordSequence sequence = null;
        bool delete = true;

        public MyLog()
        {
            // Create a FileRecordSequence
            sequence = new FileRecordSequence(logName, FileAccess.ReadWrite);
        }

        // Append records to the record sequence.
        public void AppendRecords()
        {
            Console.WriteLine("Appending Log Records...");
            SequenceNumber previous = SequenceNumber.Invalid;

            previous = sequence.Append(CreateData("Hello World!"), SequenceNumber.Invalid, SequenceNumber.Invalid, RecordAppendOptions.ForceFlush);
            previous = sequence.Append(CreateData("This is my first Logging App"), SequenceNumber.Invalid, SequenceNumber.Invalid, RecordAppendOptions.ForceFlush);
            previous = sequence.Append(CreateData("Using FileRecordSequence..."), SequenceNumber.Invalid, SequenceNumber.Invalid, RecordAppendOptions.ForceFlush);

            Console.WriteLine("Done...");
        }
    
        // Read the records added to the log.
        public void ReadRecords()
        {
            Encoding enc = Encoding.Unicode;

            Console.WriteLine();
            Console.WriteLine("Reading Log Records...");
            
            try
            {
                foreach (LogRecord record in this.sequence.ReadLogRecords(this.sequence.BaseSequenceNumber, LogRecordEnumeratorType.Next))
                {
                    byte[] data = new byte[record.Data.Length];
                    record.Data.Read(data, 0, (int)record.Data.Length);
                    string mystr = enc.GetString(data);
                    Console.WriteLine("    {0}", mystr);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception {0} {1}", e.GetType(), e.Message);
            }

            Console.WriteLine();
        }
    
        // Dispose the record sequence and delete the log file.
        public void Cleanup()
        {
            // Dispose the sequence
            sequence.Dispose();

            // Delete the log file...
            if (delete)
            {
                try
                {
                    File.Delete(this.logName);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception {0} {1}", e.GetType(), e.Message);
                }
            }
        }

        // Converts the given data to Array of ArraSegment<byte>
        public static IList<ArraySegment<byte>> CreateData(string str)
        {
            Encoding enc = Encoding.Unicode;

            byte[] array = enc.GetBytes(str);

            ArraySegment<byte>[] segments = new ArraySegment<byte>[1];
            segments[0] = new ArraySegment<byte>(array);

            return Array.AsReadOnly<ArraySegment<byte>>(segments);
        }
    }

    class LogSample
    {
        static void Main(string[] args)
        {
            MyLog log = new MyLog();

            log.AppendRecords();
            log.ReadRecords();
            log.Cleanup();
        }
    }
}

Uwagi

Dane zawarte w parametrze data będą łączone w jedną tablicę bajtów do dołączania jako rekordu. Jednak podczas odczytu rekordu nie jest wprowadzana żadna aprowizacja dzielenia danych z powrotem na segmenty tablicy.

Zwykle ta metoda kończy się przed zapisaniem rekordu. Aby upewnić się, że rekord został zapisany, określ flagę ForceFlush przy użyciu parametru recordAppendOptions lub wywołaj metodę Flush .

Dotyczy

Append(IList<ArraySegment<Byte>>, SequenceNumber, SequenceNumber, RecordAppendOptions)

Zapisuje rekord dziennika w pliku FileRecordSequence. Nie można dziedziczyć tej metody.

public:
 virtual System::IO::Log::SequenceNumber Append(System::Collections::Generic::IList<ArraySegment<System::Byte>> ^ data, System::IO::Log::SequenceNumber nextUndoRecord, System::IO::Log::SequenceNumber previousRecord, System::IO::Log::RecordAppendOptions recordAppendOptions);
public System.IO.Log.SequenceNumber Append(System.Collections.Generic.IList<ArraySegment<byte>> data, System.IO.Log.SequenceNumber nextUndoRecord, System.IO.Log.SequenceNumber previousRecord, System.IO.Log.RecordAppendOptions recordAppendOptions);
abstract member Append : System.Collections.Generic.IList<ArraySegment<byte>> * System.IO.Log.SequenceNumber * System.IO.Log.SequenceNumber * System.IO.Log.RecordAppendOptions -> System.IO.Log.SequenceNumber
override this.Append : System.Collections.Generic.IList<ArraySegment<byte>> * System.IO.Log.SequenceNumber * System.IO.Log.SequenceNumber * System.IO.Log.RecordAppendOptions -> System.IO.Log.SequenceNumber
Public Function Append (data As IList(Of ArraySegment(Of Byte)), nextUndoRecord As SequenceNumber, previousRecord As SequenceNumber, recordAppendOptions As RecordAppendOptions) As SequenceNumber

Parametry

data
IList<ArraySegment<Byte>>

Lista segmentów tablic bajtowych, które będą łączone i dołączane jako rekord.

nextUndoRecord
SequenceNumber

Numer sekwencji następnego rekordu w określonej przez użytkownika kolejności.

previousRecord
SequenceNumber

Numer sekwencji następnego rekordu w poprzedniej kolejności.

recordAppendOptions
RecordAppendOptions

Prawidłowa wartość określa sposób zapisywania RecordAppendOptions danych.

Zwraca

Numer sekwencji dołączonego rekordu dziennika.

Implementuje

Wyjątki

Co najmniej jeden argument to null.

Co najmniej jeden argument jest poza zakresem.

Nie można wykonać operacji, ponieważ sekwencja rekordów została otwarta z dostępem tylko do odczytu.

Nie można wykonać żądania z powodu nieoczekiwanego wyjątku we/wy.

Metoda została wywołana po usunięciu sekwencji.

Za mało pamięci, aby kontynuować wykonywanie programu.

Sekwencja rekordów jest pełna.

Przykłady

W poniższym przykładzie pokazano, jak utworzyć sekwencję rekordów przy użyciu tej metody.

// Append records to the record sequence.
    public void AppendRecords()
    {
        Console.WriteLine("Appending Log Records...");
        SequenceNumber previous = SequenceNumber.Invalid;

        previous = sequence.Append(CreateData("Hello World!"), SequenceNumber.Invalid, SequenceNumber.Invalid, RecordAppendOptions.ForceFlush);
        previous = sequence.Append(CreateData("This is my first Logging App"), SequenceNumber.Invalid, SequenceNumber.Invalid, RecordAppendOptions.ForceFlush);
        previous = sequence.Append(CreateData("Using FileRecordSequence..."), SequenceNumber.Invalid, SequenceNumber.Invalid, RecordAppendOptions.ForceFlush);

        Console.WriteLine("Done...");
    }
' Append records to the record sequence.
    Public Sub AppendRecords()
        Console.WriteLine("Appending Log Records...")
        Dim previous As SequenceNumber = SequenceNumber.Invalid

        previous = sequence.Append(CreateData("Hello World!"), SequenceNumber.Invalid, SequenceNumber.Invalid, RecordAppendOptions.ForceFlush)
        previous = sequence.Append(CreateData("This is my first Logging App"), SequenceNumber.Invalid, SequenceNumber.Invalid, RecordAppendOptions.ForceFlush)
        previous = sequence.Append(CreateData("Using FileRecordSequence..."), SequenceNumber.Invalid, SequenceNumber.Invalid, RecordAppendOptions.ForceFlush)

        Console.WriteLine("Done...")
    End Sub

Uwagi

Dane zawarte w parametrze data będą łączone w jedną tablicę bajtów do dołączania jako rekordu. Jednak podczas odczytu rekordu nie jest wprowadzana żadna aprowizacja dzielenia danych z powrotem na segmenty tablicy.

Zwykle ta metoda kończy się przed zapisaniem rekordu. Aby upewnić się, że rekord został zapisany, określ flagę ForceFlush przy użyciu parametru recordAppendOptions lub wywołaj metodę Flush .

Dotyczy

Append(ArraySegment<Byte>, SequenceNumber, SequenceNumber, RecordAppendOptions, ReservationCollection)

Zapisuje rekord dziennika w FileRecordSequenceobiekcie przy użyciu spacji zarezerwowanej wcześniej w sekwencji. Nie można dziedziczyć tej metody.

public:
 virtual System::IO::Log::SequenceNumber Append(ArraySegment<System::Byte> data, System::IO::Log::SequenceNumber nextUndoRecord, System::IO::Log::SequenceNumber previousRecord, System::IO::Log::RecordAppendOptions recordAppendOptions, System::IO::Log::ReservationCollection ^ reservations);
public System.IO.Log.SequenceNumber Append(ArraySegment<byte> data, System.IO.Log.SequenceNumber nextUndoRecord, System.IO.Log.SequenceNumber previousRecord, System.IO.Log.RecordAppendOptions recordAppendOptions, System.IO.Log.ReservationCollection reservations);
abstract member Append : ArraySegment<byte> * System.IO.Log.SequenceNumber * System.IO.Log.SequenceNumber * System.IO.Log.RecordAppendOptions * System.IO.Log.ReservationCollection -> System.IO.Log.SequenceNumber
override this.Append : ArraySegment<byte> * System.IO.Log.SequenceNumber * System.IO.Log.SequenceNumber * System.IO.Log.RecordAppendOptions * System.IO.Log.ReservationCollection -> System.IO.Log.SequenceNumber
Public Function Append (data As ArraySegment(Of Byte), nextUndoRecord As SequenceNumber, previousRecord As SequenceNumber, recordAppendOptions As RecordAppendOptions, reservations As ReservationCollection) As SequenceNumber

Parametry

data
ArraySegment<Byte>

Lista segmentów tablic bajtowych, które będą łączone i dołączane jako rekord.

nextUndoRecord
SequenceNumber

Numer sekwencji następnego rekordu w określonej przez użytkownika kolejności.

previousRecord
SequenceNumber

Numer sekwencji następnego rekordu w poprzedniej kolejności.

recordAppendOptions
RecordAppendOptions

Prawidłowa wartość określa sposób zapisywania RecordAppendOptions danych.

reservations
ReservationCollection

Element ReservationCollection zawierający rezerwację, która powinna być używana dla tego rekordu.

Zwraca

Numer sekwencji dołączonego rekordu dziennika.

Implementuje

Wyjątki

Co najmniej jeden argument to null.

Co najmniej jeden argument jest poza zakresem.

reservations ta sekwencja rekordów nie została utworzona.

Nie można wykonać operacji, ponieważ sekwencja rekordów została otwarta z dostępem tylko do odczytu.

Nie można wykonać żądania z powodu nieoczekiwanego wyjątku we/wy.

Metoda została wywołana po usunięciu sekwencji.

Za mało pamięci, aby kontynuować wykonywanie programu.

Sekwencja rekordów jest pełna.

Nie można znaleźć rezerwacji wystarczająco dużej, aby zmieścić data się w pliku reservations.

Uwagi

Dane zawarte w parametrze data będą łączone w jedną tablicę bajtów do dołączania jako rekordu. Jednak podczas odczytu rekordu nie jest wprowadzana żadna aprowizacja dzielenia danych z powrotem na segmenty tablicy.

Dołączony rekord będzie zużywać miejsce, które zostało wcześniej zarezerwowane przy użyciu rezerwacji określonej przez reservations parametr . Jeśli dołączanie zakończy się pomyślnie, będzie korzystać z najmniejszego obszaru rezerwacji, który może przechowywać dane, a ten obszar rezerwacji zostanie usunięty z kolekcji.

Zwykle ta metoda kończy się przed zapisaniem rekordu. Aby upewnić się, że rekord został zapisany, określ flagę ForceFlush przy użyciu parametru recordAppendOptions lub wywołaj metodę Flush .

Dotyczy

Append(IList<ArraySegment<Byte>>, SequenceNumber, SequenceNumber, RecordAppendOptions, ReservationCollection)

Zapisuje rekord dziennika w FileRecordSequenceobiekcie przy użyciu spacji zarezerwowanej wcześniej w sekwencji. Nie można dziedziczyć tej metody.

public:
 virtual System::IO::Log::SequenceNumber Append(System::Collections::Generic::IList<ArraySegment<System::Byte>> ^ data, System::IO::Log::SequenceNumber nextUndoRecord, System::IO::Log::SequenceNumber previousRecord, System::IO::Log::RecordAppendOptions recordAppendOptions, System::IO::Log::ReservationCollection ^ reservations);
public System.IO.Log.SequenceNumber Append(System.Collections.Generic.IList<ArraySegment<byte>> data, System.IO.Log.SequenceNumber nextUndoRecord, System.IO.Log.SequenceNumber previousRecord, System.IO.Log.RecordAppendOptions recordAppendOptions, System.IO.Log.ReservationCollection reservations);
abstract member Append : System.Collections.Generic.IList<ArraySegment<byte>> * System.IO.Log.SequenceNumber * System.IO.Log.SequenceNumber * System.IO.Log.RecordAppendOptions * System.IO.Log.ReservationCollection -> System.IO.Log.SequenceNumber
override this.Append : System.Collections.Generic.IList<ArraySegment<byte>> * System.IO.Log.SequenceNumber * System.IO.Log.SequenceNumber * System.IO.Log.RecordAppendOptions * System.IO.Log.ReservationCollection -> System.IO.Log.SequenceNumber
Public Function Append (data As IList(Of ArraySegment(Of Byte)), nextUndoRecord As SequenceNumber, previousRecord As SequenceNumber, recordAppendOptions As RecordAppendOptions, reservations As ReservationCollection) As SequenceNumber

Parametry

data
IList<ArraySegment<Byte>>

Lista segmentów tablic bajtowych, które będą łączone i dołączane jako rekord.

nextUndoRecord
SequenceNumber

Numer sekwencji następnego rekordu w określonej przez użytkownika kolejności.

previousRecord
SequenceNumber

Numer sekwencji następnego rekordu w poprzedniej kolejności.

recordAppendOptions
RecordAppendOptions

Prawidłowa wartość określa sposób zapisywania RecordAppendOptions danych.

reservations
ReservationCollection

Element ReservationCollection zawierający rezerwację, która powinna być używana dla tego rekordu.

Zwraca

Numer sekwencji dołączonego rekordu dziennika.

Implementuje

Wyjątki

Co najmniej jeden argument to null.

Co najmniej jeden argument jest poza zakresem.

reservations ta sekwencja rekordów nie została utworzona.

Nie można wykonać operacji, ponieważ sekwencja rekordów została otwarta z dostępem tylko do odczytu.

Nie można wykonać żądania z powodu nieoczekiwanego wyjątku we/wy.

Metoda została wywołana po usunięciu sekwencji.

Za mało pamięci, aby kontynuować wykonywanie programu.

Sekwencja rekordów jest pełna.

Nie można znaleźć rezerwacji wystarczająco dużej, aby zmieścić data się w pliku reservations.

Uwagi

Dane zawarte w parametrze data będą łączone w jedną tablicę bajtów do dołączania jako rekordu. Jednak podczas odczytu rekordu nie jest wprowadzana żadna aprowizacja dzielenia danych z powrotem na segmenty tablicy.

Dołączony rekord będzie zużywać miejsce, które zostało wcześniej zarezerwowane przy użyciu rezerwacji określonej przez reservations parametr . Jeśli dołączanie zakończy się pomyślnie, będzie korzystać z najmniejszego obszaru rezerwacji, który może przechowywać dane, a ten obszar rezerwacji zostanie usunięty z kolekcji.

Zwykle ta metoda kończy się przed zapisaniem rekordu. Aby upewnić się, że rekord został zapisany, określ flagę ForceFlush przy użyciu parametru recordAppendOptions lub wywołaj metodę Flush .

Dotyczy