FileRecordSequence.Append Metod

Definition

Skriver en loggpost till FileRecordSequence.

Överlagringar

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

Skriver en loggpost till FileRecordSequence. Den här metoden kan inte ärvas.

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

Skriver en loggpost till FileRecordSequence. Den här metoden kan inte ärvas.

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

Skriver en loggpost till FileRecordSequence, med hjälp av utrymme som tidigare reserverats i sekvensen. Den här metoden kan inte ärvas.

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

Skriver en loggpost till FileRecordSequence, med hjälp av utrymme som tidigare reserverats i sekvensen. Den här metoden kan inte ärvas.

Exempel

I följande exempel skapas en postsekvens, posten läggs till i den och posterna läss slutligen.


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)

Skriver en loggpost till FileRecordSequence. Den här metoden kan inte ärvas.

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

Parametrar

data
ArraySegment<Byte>

En lista över bytematrissegment som sammanfogas och läggs till som post.

nextUndoRecord
SequenceNumber

Sekvensnumret för nästa post i den användardefinierade ordningen.

previousRecord
SequenceNumber

Sekvensnumret för nästa post i Föregående ordning.

recordAppendOptions
RecordAppendOptions

Ett giltigt värde RecordAppendOptions för detta anger hur data ska skrivas.

Returer

Sekvensnumret för den bifogade loggposten.

Implementeringar

Undantag

Ett eller flera av argumenten är null.

Ett eller flera av argumenten ligger inom intervallet.

Det går inte att utföra åtgärden eftersom postsekvensen öppnades med skrivskyddad åtkomst.

Det gick inte att utföra begäran på grund av ett oväntat I/O-undantag.

Metoden anropades efter att sekvensen har tagits bort.

Det finns inte tillräckligt med minne för att fortsätta körningen av programmet.

Postsekvensen är full.

Exempel

I följande exempel skapas en postsekvens, posten läggs till i den och posterna läss slutligen.

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

Kommentarer

Data som finns i parametern data sammanfogas till en enskild bytematris för att läggas till som post. Ingen etablering görs dock för att dela upp data i matrissegment igen när posten läse.

Normalt slutförs den här metoden innan posten har skrivits. För att säkerställa att en post har skrivits anger du ForceFlush antingen flaggan med parametern recordAppendOptions eller anropar Flush metoden.

Gäller för

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

Skriver en loggpost till FileRecordSequence. Den här metoden kan inte ärvas.

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

Parametrar

data
IList<ArraySegment<Byte>>

En lista över bytematrissegment som sammanfogas och läggs till som post.

nextUndoRecord
SequenceNumber

Sekvensnumret för nästa post i den användardefinierade ordningen.

previousRecord
SequenceNumber

Sekvensnumret för nästa post i Föregående ordning.

recordAppendOptions
RecordAppendOptions

Ett giltigt värde RecordAppendOptions för detta anger hur data ska skrivas.

Returer

Sekvensnumret för den bifogade loggposten.

Implementeringar

Undantag

Ett eller flera av argumenten är null.

Ett eller flera av argumenten ligger inom intervallet.

Det går inte att utföra åtgärden eftersom postsekvensen öppnades med skrivskyddad åtkomst.

Det gick inte att utföra begäran på grund av ett oväntat I/O-undantag.

Metoden anropades efter att sekvensen har tagits bort.

Det finns inte tillräckligt med minne för att fortsätta körningen av programmet.

Postsekvensen är full.

Exempel

I följande exempel visas hur du kan skapa en postsekvens med den här metoden.

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

Kommentarer

Data som finns i parametern data sammanfogas till en enskild bytematris för att läggas till som post. Ingen etablering görs dock för att dela upp data i matrissegment igen när posten läse.

Normalt slutförs den här metoden innan posten har skrivits. För att säkerställa att en post har skrivits anger du ForceFlush antingen flaggan med parametern recordAppendOptions eller anropar Flush metoden.

Gäller för

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

Skriver en loggpost till FileRecordSequence, med hjälp av utrymme som tidigare reserverats i sekvensen. Den här metoden kan inte ärvas.

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

Parametrar

data
ArraySegment<Byte>

En lista över bytematrissegment som sammanfogas och läggs till som post.

nextUndoRecord
SequenceNumber

Sekvensnumret för nästa post i den användardefinierade ordningen.

previousRecord
SequenceNumber

Sekvensnumret för nästa post i Föregående ordning.

recordAppendOptions
RecordAppendOptions

Ett giltigt värde RecordAppendOptions för detta anger hur data ska skrivas.

reservations
ReservationCollection

En ReservationCollection som innehåller reservationen som ska användas för den här posten.

Returer

Sekvensnumret för den bifogade loggposten.

Implementeringar

Undantag

Ett eller flera av argumenten är null.

Ett eller flera av argumenten ligger inom intervallet.

reservations skapades inte av den här postsekvensen.

Det går inte att utföra åtgärden eftersom postsekvensen öppnades med skrivskyddad åtkomst.

Det gick inte att utföra begäran på grund av ett oväntat I/O-undantag.

Metoden anropades efter att sekvensen har tagits bort.

Det finns inte tillräckligt med minne för att fortsätta körningen av programmet.

Postsekvensen är full.

Det finns ingen reservation som är tillräckligt stor för att passa data i reservations.

Kommentarer

Data som finns i parametern data sammanfogas till en enskild bytematris för att läggas till som post. Ingen etablering görs dock för att dela upp data i matrissegment igen när posten läse.

Den bifogade posten förbrukar utrymme som tidigare har reserverats med hjälp av en reservation som anges av parametern reservations . Om tillägget lyckas kommer det att förbruka det minsta reservationsområdet som kan innehålla data, och det reservationsområdet tas bort från samlingen.

Normalt slutförs den här metoden innan posten har skrivits. För att säkerställa att en post har skrivits anger du ForceFlush antingen flaggan med parametern recordAppendOptions eller anropar Flush metoden.

Gäller för

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

Skriver en loggpost till FileRecordSequence, med hjälp av utrymme som tidigare reserverats i sekvensen. Den här metoden kan inte ärvas.

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

Parametrar

data
IList<ArraySegment<Byte>>

En lista över bytematrissegment som sammanfogas och läggs till som post.

nextUndoRecord
SequenceNumber

Sekvensnumret för nästa post i den användardefinierade ordningen.

previousRecord
SequenceNumber

Sekvensnumret för nästa post i Föregående ordning.

recordAppendOptions
RecordAppendOptions

Ett giltigt värde RecordAppendOptions för detta anger hur data ska skrivas.

reservations
ReservationCollection

En ReservationCollection som innehåller reservationen som ska användas för den här posten.

Returer

Sekvensnumret för den bifogade loggposten.

Implementeringar

Undantag

Ett eller flera av argumenten är null.

Ett eller flera av argumenten ligger inom intervallet.

reservations skapades inte av den här postsekvensen.

Det går inte att utföra åtgärden eftersom postsekvensen öppnades med skrivskyddad åtkomst.

Det gick inte att utföra begäran på grund av ett oväntat I/O-undantag.

Metoden anropades efter att sekvensen har tagits bort.

Det finns inte tillräckligt med minne för att fortsätta körningen av programmet.

Postsekvensen är full.

Det finns ingen reservation som är tillräckligt stor för att passa data i reservations.

Kommentarer

Data som finns i parametern data sammanfogas till en enskild bytematris för att läggas till som post. Ingen etablering görs dock för att dela upp data i matrissegment igen när posten läse.

Den bifogade posten förbrukar utrymme som tidigare har reserverats med hjälp av en reservation som anges av parametern reservations . Om tillägget lyckas kommer det att förbruka det minsta reservationsområdet som kan innehålla data, och det reservationsområdet tas bort från samlingen.

Normalt slutförs den här metoden innan posten har skrivits. För att säkerställa att en post har skrivits anger du ForceFlush antingen flaggan med parametern recordAppendOptions eller anropar Flush metoden.

Gäller för