Share via


FileRecordSequence.Append Metode

Definisi

Menulis catatan log ke FileRecordSequence.

Overload

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

Menulis catatan log ke FileRecordSequence. Metode ini tidak dapat diwariskan.

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

Menulis catatan log ke FileRecordSequence. Metode ini tidak dapat diwariskan.

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

Menulis rekaman log ke FileRecordSequence, menggunakan ruang yang sebelumnya dipesan dalam urutan. Metode ini tidak dapat diwariskan.

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

Menulis rekaman log ke FileRecordSequence, menggunakan ruang yang sebelumnya dipesan dalam urutan. Metode ini tidak dapat diwariskan.

Contoh

Contoh berikut membuat urutan rekaman, menambahkan rekaman ke dalamnya, dan akhirnya membaca rekaman.


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)

Menulis catatan log ke FileRecordSequence. Metode ini tidak dapat diwariskan.

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

Parameter

data
ArraySegment<Byte>

Daftar segmen array byte yang akan digabungkan dan ditambahkan sebagai rekaman.

nextUndoRecord
SequenceNumber

Nomor urut rekaman berikutnya dalam urutan yang ditentukan pengguna.

previousRecord
SequenceNumber

Nomor urut rekaman berikutnya dalam Urutan sebelumnya.

recordAppendOptions
RecordAppendOptions

Nilai RecordAppendOptions valid yang menentukan bagaimana data harus ditulis.

Mengembalikan

Nomor urut rekaman log yang ditambahkan.

Penerapan

Pengecualian

Satu atau beberapa argumen adalah null.

Satu atau beberapa argumen berada di luar rentang.

Operasi tidak dapat dilakukan karena urutan rekaman dibuka dengan akses baca-saja.

Permintaan tidak dapat dilakukan karena pengecualian I/O yang tidak terduga.

Metode ini dipanggil setelah urutan dibuang.

Memori tidak cukup untuk melanjutkan eksekusi program.

Urutan rekaman penuh.

Contoh

Contoh berikut membuat urutan rekaman, menambahkan rekaman ke dalamnya, dan akhirnya membaca rekaman.

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

Keterangan

Data yang terkandung dalam data parameter akan digabungkan ke dalam array byte tunggal untuk ditambahkan sebagai rekaman. Namun, tidak ada ketentuan yang dibuat untuk memisahkan data kembali ke segmen array saat rekaman dibaca.

Biasanya, metode ini selesai sebelum rekaman ditulis. Untuk memastikan bahwa rekaman telah ditulis, tentukan ForceFlush bendera menggunakan recordAppendOptions parameter , atau panggil Flush metode .

Berlaku untuk

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

Menulis catatan log ke FileRecordSequence. Metode ini tidak dapat diwariskan.

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

Parameter

data
IList<ArraySegment<Byte>>

Daftar segmen array byte yang akan digabungkan dan ditambahkan sebagai rekaman.

nextUndoRecord
SequenceNumber

Nomor urut rekaman berikutnya dalam urutan yang ditentukan pengguna.

previousRecord
SequenceNumber

Nomor urut rekaman berikutnya dalam Urutan sebelumnya.

recordAppendOptions
RecordAppendOptions

Nilai RecordAppendOptions valid yang menentukan bagaimana data harus ditulis.

Mengembalikan

Nomor urut rekaman log yang ditambahkan.

Penerapan

Pengecualian

Satu atau beberapa argumen adalah null.

Satu atau beberapa argumen berada di luar rentang.

Operasi tidak dapat dilakukan karena urutan rekaman dibuka dengan akses baca-saja.

Permintaan tidak dapat dilakukan karena pengecualian I/O yang tidak terduga.

Metode ini dipanggil setelah urutan dibuang.

Memori tidak cukup untuk melanjutkan eksekusi program.

Urutan rekaman penuh.

Contoh

Contoh berikut menunjukkan bagaimana Anda bisa membuat urutan rekaman dengan metode ini.

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

Keterangan

Data yang terkandung dalam data parameter akan digabungkan ke dalam array byte tunggal untuk ditambahkan sebagai rekaman. Namun, tidak ada ketentuan yang dibuat untuk memisahkan data kembali ke segmen array saat rekaman dibaca.

Biasanya, metode ini selesai sebelum rekaman ditulis. Untuk memastikan bahwa rekaman telah ditulis, tentukan ForceFlush bendera menggunakan recordAppendOptions parameter , atau panggil Flush metode .

Berlaku untuk

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

Menulis rekaman log ke FileRecordSequence, menggunakan ruang yang sebelumnya dipesan dalam urutan. Metode ini tidak dapat diwariskan.

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

Parameter

data
ArraySegment<Byte>

Daftar segmen array byte yang akan digabungkan dan ditambahkan sebagai rekaman.

nextUndoRecord
SequenceNumber

Nomor urut rekaman berikutnya dalam urutan yang ditentukan pengguna.

previousRecord
SequenceNumber

Nomor urut rekaman berikutnya dalam Urutan sebelumnya.

recordAppendOptions
RecordAppendOptions

Nilai RecordAppendOptions valid yang menentukan bagaimana data harus ditulis.

reservations
ReservationCollection

ReservationCollection yang berisi reservasi yang harus digunakan untuk rekaman ini.

Mengembalikan

Nomor urut rekaman log yang ditambahkan.

Penerapan

Pengecualian

Satu atau beberapa argumen adalah null.

Satu atau beberapa argumen berada di luar rentang.

reservations tidak dibuat oleh urutan rekaman ini.

Operasi tidak dapat dilakukan karena urutan rekaman dibuka dengan akses baca-saja.

Permintaan tidak dapat dilakukan karena pengecualian I/O yang tidak terduga.

Metode ini dipanggil setelah urutan dibuang.

Memori tidak cukup untuk melanjutkan eksekusi program.

Urutan rekaman penuh.

Tidak ada reservasi yang cukup besar agar pas data dapat ditemukan di reservations.

Keterangan

Data yang terkandung dalam data parameter akan digabungkan ke dalam array byte tunggal untuk ditambahkan sebagai rekaman. Namun, tidak ada ketentuan yang dibuat untuk memisahkan data kembali ke segmen array saat rekaman dibaca.

Catatan yang ditambahkan akan menggunakan ruang yang telah dipesan sebelumnya, menggunakan reservasi yang ditentukan oleh reservations parameter . Jika penambah berhasil, itu akan mengonsumsi area reservasi terkecil yang dapat menyimpan data, dan area reservasi tersebut akan dihapus dari koleksi.

Biasanya, metode ini selesai sebelum rekaman ditulis. Untuk memastikan bahwa rekaman telah ditulis, tentukan ForceFlush bendera menggunakan recordAppendOptions parameter , atau panggil Flush metode .

Berlaku untuk

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

Menulis rekaman log ke FileRecordSequence, menggunakan ruang yang sebelumnya dipesan dalam urutan. Metode ini tidak dapat diwariskan.

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

Parameter

data
IList<ArraySegment<Byte>>

Daftar segmen array byte yang akan digabungkan dan ditambahkan sebagai rekaman.

nextUndoRecord
SequenceNumber

Nomor urut rekaman berikutnya dalam urutan yang ditentukan pengguna.

previousRecord
SequenceNumber

Nomor urut rekaman berikutnya dalam Urutan sebelumnya.

recordAppendOptions
RecordAppendOptions

Nilai RecordAppendOptions valid yang menentukan bagaimana data harus ditulis.

reservations
ReservationCollection

ReservationCollection yang berisi reservasi yang harus digunakan untuk rekaman ini.

Mengembalikan

Nomor urut rekaman log yang ditambahkan.

Penerapan

Pengecualian

Satu atau beberapa argumen adalah null.

Satu atau beberapa argumen berada di luar rentang.

reservations tidak dibuat oleh urutan rekaman ini.

Operasi tidak dapat dilakukan karena urutan rekaman dibuka dengan akses baca-saja.

Permintaan tidak dapat dilakukan karena pengecualian I/O yang tidak terduga.

Metode ini dipanggil setelah urutan dibuang.

Memori tidak cukup untuk melanjutkan eksekusi program.

Urutan rekaman penuh.

Tidak ada reservasi yang cukup besar agar pas data dapat ditemukan di reservations.

Keterangan

Data yang terkandung dalam data parameter akan digabungkan ke dalam array byte tunggal untuk ditambahkan sebagai rekaman. Namun, tidak ada ketentuan yang dibuat untuk memisahkan data kembali ke segmen array saat rekaman dibaca.

Catatan yang ditambahkan akan menggunakan ruang yang telah dipesan sebelumnya, menggunakan reservasi yang ditentukan oleh reservations parameter . Jika penambah berhasil, itu akan mengonsumsi area reservasi terkecil yang dapat menyimpan data, dan area reservasi tersebut akan dihapus dari koleksi.

Biasanya, metode ini selesai sebelum rekaman ditulis. Untuk memastikan bahwa rekaman telah ditulis, tentukan ForceFlush bendera menggunakan recordAppendOptions parameter , atau panggil Flush metode .

Berlaku untuk