FileRecordSequence 类

定义

实现文件 IRecordSequence 顶部。 此类不能被继承。

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
继承
FileRecordSequence
实现

示例

以下示例创建记录序列,向其追加记录,最后读取记录。


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

注解

FileRecordSequence这是基于文件系统中的单个日志文件的记录序列。 它是接口的 IRecordSequence 简单实现,位于基于文件的简单日志之上。

若要操作基于文件的日志,应用程序在其中运行的帐户必须具有足够的权限,因为构造时由文件系统安全性 FileRecordSequence 决定。 此外,在构造时对 FullTrust 的需求也是必需的。 权限验证结果会随Windows安全模型一起缓存。 应确保不会意外地将记录序列的内容公开给未经授权的用户。

构造函数

名称 说明
FileRecordSequence(String, FileAccess, Int32)

使用指定的文件、访问模式和文件大小初始化类的新实例 FileRecordSequence

FileRecordSequence(String, FileAccess)

使用指定的文件和访问模式初始化类的新实例 FileRecordSequence

FileRecordSequence(String)

使用指定的文件初始化类的新实例 FileRecordSequence

属性

名称 说明
BaseSequenceNumber

获取当前 FileRecordSequence中第一个有效记录的序列号。

LastSequenceNumber

获取大于追加的最后一条记录的序列号。

MaximumRecordLength

获取可追加到此序列或从此序列中读取的最大记录的大小(以字节为单位)。

ReservedBytes

获取已保留的字节总数。

RestartSequenceNumber

获取最近写入的重启区域的序列号。

RetryAppend

获取或设置一个值,该值指示是否在日志已满时自动重试追加。

方法

名称 说明
AdvanceBaseSequenceNumber(SequenceNumber)

向前移动日志的基序列号。 无法继承此方法。

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

使用以前在序列中保留的空间将日志记录 FileRecordSequence写入日志。 无法继承此方法。

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

将日志记录写入 .FileRecordSequence 无法继承此方法。

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

使用以前在序列中保留的空间将日志记录 FileRecordSequence写入日志。 无法继承此方法。

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

将日志记录写入 .FileRecordSequence 无法继承此方法。

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

开始异步追加操作。 无法继承此方法。

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

使用以前在序列中保留的空间开始异步追加操作。 无法继承此方法。

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

开始异步追加操作。 无法继承此方法。

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

使用以前在序列中保留的空间开始异步追加操作。 无法继承此方法。

BeginFlush(SequenceNumber, AsyncCallback, Object)

使用以前在序列中保留的空间开始异步刷新操作。 无法继承此方法。

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

开始异步保留和追加操作。 无法继承此方法。

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

开始异步保留和追加操作。 无法继承此方法。

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

使用以前在序列中保留的空间开始异步重启区域写入操作。 无法继承此方法。

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

使用以前在序列中保留的空间开始异步重启区域写入操作。 无法继承此方法。

CreateReservationCollection()

创建新的 ReservationCollection。 无法继承此方法。

Dispose()

立即释放对象使用的非托管资源。

EndAppend(IAsyncResult)

结束异步追加操作。 无法继承此方法。

EndFlush(IAsyncResult)

结束异步刷新操作。 无法继承此方法。

EndReserveAndAppend(IAsyncResult)

结束异步保留和追加操作。 无法继承此方法。

EndWriteRestartArea(IAsyncResult)

结束异步重启区域写入操作。 无法继承此方法。

Equals(Object)

确定指定的对象是否等于当前对象。

(继承自 Object)
Flush()

确保已写入所有追加记录。 无法继承此方法。

Flush(SequenceNumber)

确保已写入所有追加记录。 无法继承此方法。

GetHashCode()

用作默认哈希函数。

(继承自 Object)
GetType()

获取当前实例的 Type

(继承自 Object)
MemberwiseClone()

创建当前 Object的浅表副本。

(继承自 Object)
ReadLogRecords(SequenceNumber, LogRecordEnumeratorType)

返回序列中记录的可枚举集合。 无法继承此方法。

ReadRestartAreas()

返回序列中重启区域的可枚举集合。 无法继承此方法。

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

自动创建单个预留,并将记录追加到序列中。 无法继承此方法。

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

自动创建单个预留,并将记录追加到序列中。 无法继承此方法。

ToString()

返回一个表示当前对象的字符串。

(继承自 Object)
WriteRestartArea(ArraySegment<Byte>, SequenceNumber, ReservationCollection)

将重启区域写入到 .FileRecordSequence 无法继承此方法。

WriteRestartArea(ArraySegment<Byte>, SequenceNumber)

将重启区域写入到 .FileRecordSequence 无法继承此方法。

WriteRestartArea(ArraySegment<Byte>)

将重启区域写入到 .FileRecordSequence 无法继承此方法。

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

将重启区域写入到 .FileRecordSequence 无法继承此方法。

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

将重启区域写入到 .FileRecordSequence 无法继承此方法。

WriteRestartArea(IList<ArraySegment<Byte>>)

将重启区域写入到 .FileRecordSequence 无法继承此方法。

活动

名称 说明
TailPinned

当记录序列确定尾部必须向前移动时发生。 无法继承此方法。

适用于