다음을 통해 공유


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가 생성되는 시점에 파일 시스템 보안에서 규정하는 대로, 애플리케이션을 실행하는 계정에 충분한 권한이 있어야 합니다. 또한, 전체 트러스트에 대한 수요는 건설 시간에 이루어집니다. 권한 확인 결과는 이후 Windows 보안 모델에 따라 캐시됩니다. 레코드 시퀀스의 콘텐츠를 무단 사용자에게 실수로 노출하지 않도록 해야 합니다.

생성자

FileRecordSequence(String)

지정된 파일을 사용하여 FileRecordSequence 클래스의 새 인스턴스를 초기화합니다.

FileRecordSequence(String, FileAccess)

지정된 파일과 액세스 모드를 사용하여 FileRecordSequence 클래스의 새 인스턴스를 초기화합니다.

FileRecordSequence(String, FileAccess, Int32)

지정된 파일, 액세스 모드, 파일 크기를 사용하여 FileRecordSequence 클래스의 새 인스턴스를 초기화합니다.

속성

BaseSequenceNumber

현재 FileRecordSequence에서 유효한 첫 번째 레코드의 시퀀스 번호를 가져옵니다.

LastSequenceNumber

마지막으로 추가된 레코드보다 큰 시퀀스 번호를 가져옵니다.

MaximumRecordLength

이 시퀀스에 추가하거나 읽을 수 있는 가장 큰 레코드의 크기(바이트)를 가져옵니다.

ReservedBytes

예약된 총 바이트 수를 가져옵니다.

RestartSequenceNumber

가장 최근에 쓴 재시작 영역의 시퀀스 번호를 가져옵니다.

RetryAppend

로그가 꽉 차는 경우 추가 작업이 자동으로 다시 시도되는지 여부를 나타내는 값을 가져오거나 설정합니다.

메서드

AdvanceBaseSequenceNumber(SequenceNumber)

로그의 기준 시퀀스 번호를 앞으로 이동합니다. 이 메서드는 상속될 수 없습니다.

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

로그 레코드를 FileRecordSequence에 씁니다. 이 메서드는 상속될 수 없습니다.

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

시퀀스에서 이전에 예약된 공간을 사용하여 로그 레코드를 FileRecordSequence에 씁니다. 이 메서드는 상속될 수 없습니다.

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

로그 레코드를 FileRecordSequence에 씁니다. 이 메서드는 상속될 수 없습니다.

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

시퀀스에서 이전에 예약된 공간을 사용하여 로그 레코드를 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>)

FileRecordSequence에 재시작 영역을 씁니다. 이 메서드는 상속될 수 없습니다.

WriteRestartArea(ArraySegment<Byte>, SequenceNumber)

FileRecordSequence에 재시작 영역을 씁니다. 이 메서드는 상속될 수 없습니다.

WriteRestartArea(ArraySegment<Byte>, SequenceNumber, ReservationCollection)

FileRecordSequence에 재시작 영역을 씁니다. 이 메서드는 상속될 수 없습니다.

WriteRestartArea(IList<ArraySegment<Byte>>)

FileRecordSequence에 재시작 영역을 씁니다. 이 메서드는 상속될 수 없습니다.

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

FileRecordSequence에 재시작 영역을 씁니다. 이 메서드는 상속될 수 없습니다.

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

FileRecordSequence에 재시작 영역을 씁니다. 이 메서드는 상속될 수 없습니다.

이벤트

TailPinned

레코드 시퀀스에서 테일이 앞으로 이동해야 한다고 결정하면 발생합니다. 이 메서드는 상속될 수 없습니다.

적용 대상