FileRecordSequence.Append Método

Definición

Escribe una entrada de registro en la FileRecordSequence.

Sobrecargas

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

Escribe una entrada de registro en la FileRecordSequence. Este método no se puede heredar.

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

Escribe una entrada de registro en la FileRecordSequence. Este método no se puede heredar.

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

Escribe una entrada de registro en la FileRecordSequence, utilizando el espacio previamente reservado en la secuencia. Este método no se puede heredar.

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

Escribe una entrada de registro en la FileRecordSequence, utilizando el espacio previamente reservado en la secuencia. Este método no se puede heredar.

Ejemplos

El siguiente ejemplo crea una secuencia de registro, anexa el registro a ella y finalmente lee los registros.


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)

Escribe una entrada de registro en la FileRecordSequence. Este método no se puede heredar.

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

Parámetros

data
ArraySegment<Byte>

Una lista de segmentos de la matriz de bytes que se concatenarán y anexarán como el registro.

nextUndoRecord
SequenceNumber

El número de secuencia del registro siguiente en el orden especificado por el usuario.

previousRecord
SequenceNumber

El número de secuencia del registro siguiente en orden anterior.

recordAppendOptions
RecordAppendOptions

Un valor válido de RecordAppendOptions que especifica cómo se deberían escribir los datos.

Devoluciones

Número de secuencia del registro de entrada anexado.

Implementaciones

Excepciones

Uno o varios argumentos tienen el valor null.

Uno o varios argumentos están fuera del intervalo.

La operación no se puede realizar porque la secuencia del registro se abrió con acceso de solo lectura.

La solicitud no se pudo realizar debido a una excepción de E/S inesperada.

Se llamó al método una vez eliminada la secuencia.

No hay bastante memoria para continuar la ejecución del programa.

La secuencia del registro está completa.

Ejemplos

El siguiente ejemplo crea una secuencia de registro, anexa el registro a ella y finalmente lee los registros.

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();
        }
    }
}

Comentarios

Los datos contenidos en el parámetro data se concatenarán en una matriz de bytes única para anexarlos como el registro. Sin embargo, no se ha realizado ninguna disposición para dividir los datode nuevo en los segmentos de la matriz cuando se lee el registro.

Normalmente, este método se completa antes de que se haya escrito el registro. Para asegurarse de que se ha escrito un registro, especifique la marca ForceFlush utilizando el parámetro recordAppendOptions o llame al método Flush.

Se aplica a

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

Escribe una entrada de registro en la FileRecordSequence. Este método no se puede heredar.

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

Parámetros

data
IList<ArraySegment<Byte>>

Una lista de segmentos de la matriz de bytes que se concatenarán y anexarán como el registro.

nextUndoRecord
SequenceNumber

El número de secuencia del registro siguiente en el orden especificado por el usuario.

previousRecord
SequenceNumber

El número de secuencia del registro siguiente en orden anterior.

recordAppendOptions
RecordAppendOptions

Un valor válido de RecordAppendOptions que especifica cómo se deberían escribir los datos.

Devoluciones

Número de secuencia del registro de entrada anexado.

Implementaciones

Excepciones

Uno o varios argumentos tienen el valor null.

Uno o varios argumentos están fuera del intervalo.

La operación no se puede realizar porque la secuencia del registro se abrió con acceso de solo lectura.

La solicitud no se pudo realizar debido a una excepción de E/S inesperada.

Se llamó al método una vez eliminada la secuencia.

No hay bastante memoria para continuar la ejecución del programa.

La secuencia del registro está completa.

Ejemplos

El siguiente ejemplo muestra cómo crear una secuencia del registro con este método.

// 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

Comentarios

Los datos contenidos en el parámetro data se concatenarán en una matriz de bytes única para anexarlos como el registro. Sin embargo, no se ha realizado ninguna disposición para dividir los datode nuevo en los segmentos de la matriz cuando se lee el registro.

Normalmente, este método se completa antes de que se haya escrito el registro. Para asegurarse de que se ha escrito un registro, especifique la marca ForceFlush utilizando el parámetro recordAppendOptions o llame al método Flush.

Se aplica a

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

Escribe una entrada de registro en la FileRecordSequence, utilizando el espacio previamente reservado en la secuencia. Este método no se puede heredar.

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

Parámetros

data
ArraySegment<Byte>

Una lista de segmentos de la matriz de bytes que se concatenarán y anexarán como el registro.

nextUndoRecord
SequenceNumber

El número de secuencia del registro siguiente en el orden especificado por el usuario.

previousRecord
SequenceNumber

El número de secuencia del registro siguiente en orden anterior.

recordAppendOptions
RecordAppendOptions

Un valor válido de RecordAppendOptions que especifica cómo se deberían escribir los datos.

reservations
ReservationCollection

Una ReservationCollection que contiene la reserva que se debería utilizar para este registro.

Devoluciones

Número de secuencia del registro de entrada anexado.

Implementaciones

Excepciones

Uno o varios argumentos tienen el valor null.

Uno o varios argumentos están fuera del intervalo.

Esta secuencia del registro no creó reservations.

La operación no se puede realizar porque la secuencia del registro se abrió con acceso de solo lectura.

La solicitud no se pudo realizar debido a una excepción de E/S inesperada.

Se llamó al método una vez eliminada la secuencia.

No hay bastante memoria para continuar la ejecución del programa.

La secuencia del registro está completa.

No se puede encontrar en data ninguna reserva lo suficientemente grande para ajustar reservations.

Comentarios

Los datos contenidos en el parámetro data se concatenarán en una matriz de bytes única para anexarlos como el registro. Sin embargo, no se ha realizado ninguna disposición para dividir los datode nuevo en los segmentos de la matriz cuando se lee el registro.

El registro anexado utilizará el espacio que se ha reservado previamente, utilizando una reserva especificada por el parámetro reservations. Si el anexado tiene éxito, utilizará el área de reserva menor posible que pueda contener los datos y esa área de reserva se quitará de la colección.

Normalmente, este método se completa antes de que se haya escrito el registro. Para asegurarse de que se ha escrito un registro, especifique la marca ForceFlush utilizando el parámetro recordAppendOptions o llame al método Flush.

Se aplica a

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

Escribe una entrada de registro en la FileRecordSequence, utilizando el espacio previamente reservado en la secuencia. Este método no se puede heredar.

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

Parámetros

data
IList<ArraySegment<Byte>>

Una lista de segmentos de la matriz de bytes que se concatenarán y anexarán como el registro.

nextUndoRecord
SequenceNumber

El número de secuencia del registro siguiente en el orden especificado por el usuario.

previousRecord
SequenceNumber

El número de secuencia del registro siguiente en orden anterior.

recordAppendOptions
RecordAppendOptions

Un valor válido de RecordAppendOptions que especifica cómo se deberían escribir los datos.

reservations
ReservationCollection

Una ReservationCollection que contiene la reserva que se debería utilizar para este registro.

Devoluciones

Número de secuencia del registro de entrada anexado.

Implementaciones

Excepciones

Uno o varios argumentos tienen el valor null.

Uno o varios argumentos están fuera del intervalo.

Esta secuencia del registro no creó reservations.

La operación no se puede realizar porque la secuencia del registro se abrió con acceso de solo lectura.

La solicitud no se pudo realizar debido a una excepción de E/S inesperada.

Se llamó al método una vez eliminada la secuencia.

No hay bastante memoria para continuar la ejecución del programa.

La secuencia del registro está completa.

No se puede encontrar en data ninguna reserva lo suficientemente grande para ajustar reservations.

Comentarios

Los datos contenidos en el parámetro data se concatenarán en una matriz de bytes única para anexarlos como el registro. Sin embargo, no se ha realizado ninguna disposición para dividir los datode nuevo en los segmentos de la matriz cuando se lee el registro.

El registro anexado utilizará el espacio que se ha reservado previamente, utilizando una reserva especificada por el parámetro reservations. Si el anexado tiene éxito, utilizará el área de reserva menor posible que pueda contener los datos y esa área de reserva se quitará de la colección.

Normalmente, este método se completa antes de que se haya escrito el registro. Para asegurarse de que se ha escrito un registro, especifique la marca ForceFlush utilizando el parámetro recordAppendOptions o llame al método Flush.

Se aplica a