FileRecordSequence.Append Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Записывает запись журнала в файл FileRecordSequence.
Перегрузки
| Имя | Описание |
|---|---|
| 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
Один или несколько аргументов находятся вне диапазона.
Невозможно выполнить операцию, так как последовательность записей была открыта с доступом только для чтения.
Не удалось выполнить запрос из-за неожиданного исключения ввода-вывода.
Метод был вызван после удаления последовательности.
Недостаточно памяти для продолжения выполнения программы.
Последовательность записей заполнена.
Примеры
В следующем примере создается последовательность записей, добавляется к ней запись и, наконец, считывает записи.
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
Один или несколько аргументов находятся вне диапазона.
Невозможно выполнить операцию, так как последовательность записей была открыта с доступом только для чтения.
Не удалось выполнить запрос из-за неожиданного исключения ввода-вывода.
Метод был вызван после удаления последовательности.
Недостаточно памяти для продолжения выполнения программы.
Последовательность записей заполнена.
Примеры
В следующем примере показано, как создать последовательность записей с помощью этого метода.
// 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 содержащий резервирование, которое должно использоваться для этой записи.
Возвращаемое значение
Порядковый номер добавленной записи журнала.
Реализации
Исключения
Один или несколько аргументов.null
Один или несколько аргументов находятся вне диапазона.
reservations не был создан этой последовательностью записей.
Невозможно выполнить операцию, так как последовательность записей была открыта с доступом только для чтения.
Не удалось выполнить запрос из-за неожиданного исключения ввода-вывода.
Метод был вызван после удаления последовательности.
Недостаточно памяти для продолжения выполнения программы.
Последовательность записей заполнена.
В ней нет достаточно большого резервирования, чтобы его можно 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 содержащий резервирование, которое должно использоваться для этой записи.
Возвращаемое значение
Порядковый номер добавленной записи журнала.
Реализации
Исключения
Один или несколько аргументов.null
Один или несколько аргументов находятся вне диапазона.
reservations не был создан этой последовательностью записей.
Невозможно выполнить операцию, так как последовательность записей была открыта с доступом только для чтения.
Не удалось выполнить запрос из-за неожиданного исключения ввода-вывода.
Метод был вызван после удаления последовательности.
Недостаточно памяти для продолжения выполнения программы.
Последовательность записей заполнена.
В ней нет достаточно большого резервирования, чтобы его можно data было найти reservations.
Комментарии
Данные, содержащиеся в параметре data , будут объединяться в один массив байтов для добавления в качестве записи. Однако при чтении записи не выполняется подготовка для разделения данных обратно на сегменты массива.
Добавленная запись будет использовать пространство, ранее зарезервированное с помощью резервирования, указанного параметром reservations . Если добавление успешно выполнено, оно будет использовать наименьшую область резервирования, которая может содержать данные, и эта область резервирования будет удалена из коллекции.
Как правило, этот метод завершается до записи. Чтобы убедиться, что запись была записана, укажите ForceFlush флаг с помощью recordAppendOptions параметра или вызовите Flush метод.