語言

FileRecordSequence.Append 方法

定義

將日誌記錄寫入 FileRecordSequence。

多載

名稱 Description
Append(ArraySegment<Byte>, SequenceNumber, SequenceNumber, RecordAppendOptions)

將日誌記錄寫入 FileRecordSequence。 無法繼承這個方法。

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

將日誌記錄寫入 FileRecordSequence。 無法繼承這個方法。

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

將日誌記錄寫入 FileRecordSequence,使用序列中先前保留的空間。 無法繼承這個方法。

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

將日誌記錄寫入 FileRecordSequence,使用序列中先前保留的空間。 無法繼承這個方法。

範例

以下範例建立一個記錄序列,將記錄附加到序列上,最後讀取記錄。


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)

將日誌記錄寫入 FileRecordSequence。 無法繼承這個方法。

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

參數

data
ArraySegment<Byte>

一份將被串接並附加為記錄的位元組陣列區段清單。

nextUndoRecord
SequenceNumber

使用者指定順序下一條記錄的序號。

previousRecord
SequenceNumber

上一筆記錄的序號。

recordAppendOptions
RecordAppendOptions

有效的值 RecordAppendOptions 會指定資料應該如何寫入。

傳回

附加日誌記錄的序號。

實作

例外狀況

其中一個或多個參數為 null。

其中一個或多個論點超出範圍。

由於記錄序列是以唯讀開啟,無法執行此操作。

由於意外的 I/O 異常,請求無法執行。

該方法是在序列被處理後才被呼叫的。

記憶體不足以繼續執行程式。

紀錄序列已滿。

範例

以下範例建立一個記錄序列,將記錄附加到序列上,最後讀取記錄。

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

備註

參數中 data 包含的資料會被串接成一個位元組陣列,作為記錄附加。 然而,讀取記錄時並未提供將資料分割回陣列區段的機制。

通常,此方法會在紀錄寫入前完成。 為了確保記錄已被寫入,請使用參數ForceFlush指定旗標,recordAppendOptions或呼叫該Flush方法。

適用於

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

將日誌記錄寫入 FileRecordSequence。 無法繼承這個方法。

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

參數

data
IList<ArraySegment<Byte>>

一份將被串接並附加為記錄的位元組陣列區段清單。

nextUndoRecord
SequenceNumber

使用者指定順序下一條記錄的序號。

previousRecord
SequenceNumber

上一筆記錄的序號。

recordAppendOptions
RecordAppendOptions

有效的值 RecordAppendOptions 會指定資料應該如何寫入。

傳回

附加日誌記錄的序號。

實作

例外狀況

其中一個或多個參數為 null。

其中一個或多個論點超出範圍。

由於記錄序列是以唯讀開啟,無法執行此操作。

由於意外的 I/O 異常,請求無法執行。

該方法是在序列被處理後才被呼叫的。

記憶體不足以繼續執行程式。

紀錄序列已滿。

範例

以下範例展示了如何用此方法建立記錄序列。

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

備註

參數中 data 包含的資料會被串接成一個位元組陣列,作為記錄附加。 然而,讀取記錄時並未提供將資料分割回陣列區段的機制。

通常,此方法會在紀錄寫入前完成。 為了確保記錄已被寫入,請使用參數ForceFlush指定旗標,recordAppendOptions或呼叫該Flush方法。

適用於

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

將日誌記錄寫入 FileRecordSequence,使用序列中先前保留的空間。 無法繼承這個方法。

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

參數

data
ArraySegment<Byte>

一份將被串接並附加為記錄的位元組陣列區段清單。

nextUndoRecord
SequenceNumber

使用者指定順序下一條記錄的序號。

previousRecord
SequenceNumber

上一筆記錄的序號。

recordAppendOptions
RecordAppendOptions

有效的值 RecordAppendOptions 會指定資料應該如何寫入。

reservations
ReservationCollection

ReservationCollection A,其中包含本紀錄應使用的保留條件。

傳回

附加日誌記錄的序號。

實作

例外狀況

其中一個或多個參數為 null。

其中一個或多個論點超出範圍。

reservations 並非由此紀錄序列所創造。

由於記錄序列是以唯讀開啟,無法執行此操作。

由於意外的 I/O 異常,請求無法執行。

該方法是在序列被處理後才被呼叫的。

記憶體不足以繼續執行程式。

紀錄序列已滿。

找不到足夠大的保留地可容納 data 於 reservations。

備註

參數中 data 包含的資料會被串接成一個位元組陣列,作為記錄附加。 然而,讀取記錄時並未提供將資料分割回陣列區段的機制。

附加的記錄會利用先前已保留的空間,並依參數 reservations 指定保留。 如果附加成功,將佔用能容納資料的最小保留區,該保留區將從集合中移除。

通常,此方法會在紀錄寫入前完成。 為了確保記錄已被寫入,請使用參數ForceFlush指定旗標,recordAppendOptions或呼叫該Flush方法。

適用於

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

將日誌記錄寫入 FileRecordSequence,使用序列中先前保留的空間。 無法繼承這個方法。

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

參數

data
IList<ArraySegment<Byte>>

一份將被串接並附加為記錄的位元組陣列區段清單。

nextUndoRecord
SequenceNumber

使用者指定順序下一條記錄的序號。

previousRecord
SequenceNumber

上一筆記錄的序號。

recordAppendOptions
RecordAppendOptions

有效的值 RecordAppendOptions 會指定資料應該如何寫入。

reservations
ReservationCollection

ReservationCollection A,其中包含本紀錄應使用的保留條件。

傳回

附加日誌記錄的序號。

實作

例外狀況

其中一個或多個參數為 null。

其中一個或多個論點超出範圍。

reservations 並非由此紀錄序列所創造。

由於記錄序列是以唯讀開啟,無法執行此操作。

由於意外的 I/O 異常,請求無法執行。

該方法是在序列被處理後才被呼叫的。

記憶體不足以繼續執行程式。

紀錄序列已滿。

找不到足夠大的保留地可容納 data 於 reservations。

備註

參數中 data 包含的資料會被串接成一個位元組陣列,作為記錄附加。 然而,讀取記錄時並未提供將資料分割回陣列區段的機制。

附加的記錄會利用先前已保留的空間,並依參數 reservations 指定保留。 如果附加成功,將佔用能容納資料的最小保留區,該保留區將從集合中移除。

通常,此方法會在紀錄寫入前完成。 為了確保記錄已被寫入,請使用參數ForceFlush指定旗標,recordAppendOptions或呼叫該Flush方法。

適用於