FileRecordSequence Class

Definition

Implements an IRecordSequence on top of a file. This class cannot be inherited.

public ref class FileRecordSequence sealed : IDisposable, System::IO::Log::IRecordSequence
public sealed class FileRecordSequence : IDisposable, System.IO.Log.IRecordSequence
type FileRecordSequence = class
    interface IRecordSequence
    interface IDisposable
Public NotInheritable Class FileRecordSequence
Implements IDisposable, IRecordSequence
Inheritance
FileRecordSequence
Implements

Examples

The following example creates a record sequence, appends record to it, and finally reads the records.


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 an Array of ArraySegment<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 Main2(string[] args)
    {
        MyLog log = new MyLog();

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

Public Class MyLog
    Private logName As String = "test.log"
    Private sequence As FileRecordSequence = Nothing
    Private delete As Boolean = True

    Public Sub New()
    ' Create a FileRecordSequence.
        sequence = New FileRecordSequence(logName, FileAccess.ReadWrite)
    End Sub

' 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

' Read the records added to the log. 
    Public Sub ReadRecords()
        Dim enc As Encoding = Encoding.Unicode

        Console.WriteLine()

        Console.WriteLine("Reading Log Records...")
        Try
            For Each record In Me.sequence.ReadLogRecords(Me.sequence.BaseSequenceNumber, LogRecordEnumeratorType.Next)
                Dim data(record.Data.Length - 1) As Byte
                record.Data.Read(data, 0, CInt(Fix(record.Data.Length)))
                Dim mystr As String = enc.GetString(data)
                Console.WriteLine("    {0}", mystr)
            Next record
        Catch e As Exception
            Console.WriteLine("Exception {0} {1}", e.GetType(), e.Message)
        End Try

        Console.WriteLine()
    End Sub

' Dispose the record sequence and delete the log file. 
    Public Sub Cleanup()
    ' Dispose the sequence.
        sequence.Dispose()

    ' Delete the log file.
        If delete Then
            Try
                File.Delete(Me.logName)
            Catch e As Exception
                Console.WriteLine("Exception {0} {1}", e.GetType(), e.Message)
            End Try
        End If
    End Sub

' Converts the given data to an Array of ArraySegment<byte> 
    Public Shared Function CreateData(ByVal str As String) As IList(Of ArraySegment(Of Byte))
        Dim enc As Encoding = Encoding.Unicode

        Dim array() As Byte = enc.GetBytes(str)

        Dim segments(0) As ArraySegment(Of Byte)
        segments(0) = New ArraySegment(Of Byte)(array)

        Return System.Array.AsReadOnly(Of ArraySegment(Of Byte))(segments)
    End Function
End Class

Friend Class LogSample
    Private Shared Sub Main2(ByVal args() As String)
        Dim log As New MyLog()

        log.AppendRecords()
        log.ReadRecords()
        log.Cleanup()
    End Sub
End Class

Remarks

The FileRecordSequence is a record sequence based on a single log file in the file system. It is a simple implementation of the IRecordSequence interface, on top of a simple file-based log.

To manipulate a file-based log, the account that your application is running in must have sufficient privileges, as dictated by the file system security at the time the FileRecordSequence is constructed. In addition, a demand for FullTrust is made at construction time. The permission verification results are cached thereafter in keeping with the Windows security model. You should ensure that you do not accidentally expose the contents of the record sequence to an unauthorized user.

Constructors

FileRecordSequence(String)

Initializes a new instance of the FileRecordSequence class with a specified file.

FileRecordSequence(String, FileAccess)

Initializes a new instance of the FileRecordSequence class with a specified file and an access mode.

FileRecordSequence(String, FileAccess, Int32)

Initializes a new instance of the FileRecordSequence class with a specified file, an access mode, and a file size.

Properties

BaseSequenceNumber

Gets the sequence number of the first valid record in the current FileRecordSequence.

LastSequenceNumber

Gets the sequence number which is greater than the last record appended.

MaximumRecordLength

Gets the size of the largest record that can be appended to or read from this sequence, in bytes.

ReservedBytes

Gets the total number of bytes that have been reserved.

RestartSequenceNumber

Gets the sequence number of the most recently written restart area.

RetryAppend

Gets or sets a value indicating whether or not appends are automatically retried if the log is full.

Methods

AdvanceBaseSequenceNumber(SequenceNumber)

Moves the base sequence number of the log forward. This method cannot be inherited.

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

Writes a log record to the FileRecordSequence. This method cannot be inherited.

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

Writes a log record to the FileRecordSequence, using space previously reserved in the sequence. This method cannot be inherited.

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

Writes a log record to the FileRecordSequence. This method cannot be inherited.

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

Writes a log record to the FileRecordSequence, using space previously reserved in the sequence. This method cannot be inherited.

BeginAppend(ArraySegment<Byte>, SequenceNumber, SequenceNumber, RecordAppendOptions, AsyncCallback, Object)

Begins an asynchronous append operation. This method cannot be inherited.

BeginAppend(ArraySegment<Byte>, SequenceNumber, SequenceNumber, RecordAppendOptions, ReservationCollection, AsyncCallback, Object)

Begins an asynchronous append operation using space previously reserved in the sequence. This method cannot be inherited.

BeginAppend(IList<ArraySegment<Byte>>, SequenceNumber, SequenceNumber, RecordAppendOptions, AsyncCallback, Object)

Begins an asynchronous append operation. This method cannot be inherited.

BeginAppend(IList<ArraySegment<Byte>>, SequenceNumber, SequenceNumber, RecordAppendOptions, ReservationCollection, AsyncCallback, Object)

Begins an asynchronous append operation using space previously reserved in the sequence. This method cannot be inherited.

BeginFlush(SequenceNumber, AsyncCallback, Object)

Begins an asynchronous flush operation, using space previously reserved in the sequence. This method cannot be inherited.

BeginReserveAndAppend(ArraySegment<Byte>, SequenceNumber, SequenceNumber, RecordAppendOptions, ReservationCollection, Int64[], AsyncCallback, Object)

Begins an asynchronous reserve and append operation. This method cannot be inherited.

BeginReserveAndAppend(IList<ArraySegment<Byte>>, SequenceNumber, SequenceNumber, RecordAppendOptions, ReservationCollection, Int64[], AsyncCallback, Object)

Begins an asynchronous reserve and append operation. This method cannot be inherited.

BeginWriteRestartArea(ArraySegment<Byte>, SequenceNumber, ReservationCollection, AsyncCallback, Object)

Begins an asynchronous restart area write operation, using space previously reserved in the sequence. This method cannot be inherited.

BeginWriteRestartArea(IList<ArraySegment<Byte>>, SequenceNumber, ReservationCollection, AsyncCallback, Object)

Begins an asynchronous restart area write operation, using space previously reserved in the sequence. This method cannot be inherited.

CreateReservationCollection()

Creates a new ReservationCollection. This method cannot be inherited.

Dispose()

Immediately releases the unmanaged resources used by an object.

EndAppend(IAsyncResult)

Ends an asynchronous append operation. This method cannot be inherited.

EndFlush(IAsyncResult)

Ends an asynchronous flush operation. This method cannot be inherited.

EndReserveAndAppend(IAsyncResult)

Ends an asynchronous reserve and append operation. This method cannot be inherited.

EndWriteRestartArea(IAsyncResult)

Ends an asynchronous restart area write operation. This method cannot be inherited.

Equals(Object)

Determines whether the specified object is equal to the current object.

(Inherited from Object)
Flush()

Ensures that all appended records have been written. This method cannot be inherited.

Flush(SequenceNumber)

Ensures that all appended records have been written. This method cannot be inherited.

GetHashCode()

Serves as the default hash function.

(Inherited from Object)
GetType()

Gets the Type of the current instance.

(Inherited from Object)
MemberwiseClone()

Creates a shallow copy of the current Object.

(Inherited from Object)
ReadLogRecords(SequenceNumber, LogRecordEnumeratorType)

Returns an enumerable collection of records in the sequence. This method cannot be inherited.

ReadRestartAreas()

Returns an enumerable collection of the restart areas in the sequence. This method cannot be inherited.

ReserveAndAppend(ArraySegment<Byte>, SequenceNumber, SequenceNumber, RecordAppendOptions, ReservationCollection, Int64[])

Automatically makes a single reservation and appends a record to the sequence. This method cannot be inherited.

ReserveAndAppend(IList<ArraySegment<Byte>>, SequenceNumber, SequenceNumber, RecordAppendOptions, ReservationCollection, Int64[])

Automatically makes a single reservation and appends a record to the sequence. This method cannot be inherited.

ToString()

Returns a string that represents the current object.

(Inherited from Object)
WriteRestartArea(ArraySegment<Byte>)

Writes a restart area to the FileRecordSequence. This method cannot be inherited.

WriteRestartArea(ArraySegment<Byte>, SequenceNumber)

Writes a restart area to the FileRecordSequence. This method cannot be inherited.

WriteRestartArea(ArraySegment<Byte>, SequenceNumber, ReservationCollection)

Writes a restart area to the FileRecordSequence. This method cannot be inherited.

WriteRestartArea(IList<ArraySegment<Byte>>)

Writes a restart area to the FileRecordSequence. This method cannot be inherited.

WriteRestartArea(IList<ArraySegment<Byte>>, SequenceNumber)

Writes a restart area to the FileRecordSequence. This method cannot be inherited.

WriteRestartArea(IList<ArraySegment<Byte>>, SequenceNumber, ReservationCollection)

Writes a restart area to the FileRecordSequence. This method cannot be inherited.

Events

TailPinned

Occurs when the record sequence determines that the tail must be moved forward. This method cannot be inherited.

Applies to