FileRecordSequence.Append メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
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 の有効な値。
返品
追加されたログ レコードのシーケンス番号。
実装
例外
1 つ以上の引数が null。
1 つ以上の引数が範囲外です。
レコード シーケンスが読み取り専用アクセスで開かれたため、操作を実行できません。
予期しない I/O 例外のため、要求を実行できませんでした。
シーケンスが破棄された後、メソッドが呼び出されました。
プログラムの実行を続行するのに十分なメモリがありません。
レコード シーケンスがいっぱいです。
例
次の例では、レコード シーケンスを作成し、レコードを追加して、最後にレコードを読み取ります。
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 パラメーターに含まれるデータは、レコードとして追加するために 1 バイト配列に連結されます。 ただし、レコードの読み取り時にデータを配列セグメントに分割するためのプロビジョニングは行われません。
通常、このメソッドはレコードが書き込まれる前に完了します。 レコードが確実に書き込まれるようにするには、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 の有効な値。
返品
追加されたログ レコードのシーケンス番号。
実装
例外
1 つ以上の引数が null。
1 つ以上の引数が範囲外です。
レコード シーケンスが読み取り専用アクセスで開かれたため、操作を実行できません。
予期しない I/O 例外のため、要求を実行できませんでした。
シーケンスが破棄された後、メソッドが呼び出されました。
プログラムの実行を続行するのに十分なメモリがありません。
レコード シーケンスがいっぱいです。
例
次の例は、このメソッドを使用してレコード シーケンスを作成する方法を示しています。
// 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 パラメーターに含まれるデータは、レコードとして追加するために 1 バイト配列に連結されます。 ただし、レコードの読み取り時にデータを配列セグメントに分割するためのプロビジョニングは行われません。
通常、このメソッドはレコードが書き込まれる前に完了します。 レコードが確実に書き込まれるようにするには、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 。
返品
追加されたログ レコードのシーケンス番号。
実装
例外
1 つ以上の引数が null。
1 つ以上の引数が範囲外です。
reservations は、このレコード シーケンスによって作成されませんでした。
レコード シーケンスが読み取り専用アクセスで開かれたため、操作を実行できません。
予期しない I/O 例外のため、要求を実行できませんでした。
シーケンスが破棄された後、メソッドが呼び出されました。
プログラムの実行を続行するのに十分なメモリがありません。
レコード シーケンスがいっぱいです。
dataに収まる大きさの予約は、reservationsで見つかりません。
注釈
data パラメーターに含まれるデータは、レコードとして追加するために 1 バイト配列に連結されます。 ただし、レコードの読み取り時にデータを配列セグメントに分割するためのプロビジョニングは行われません。
追加されたレコードは、 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 。
返品
追加されたログ レコードのシーケンス番号。
実装
例外
1 つ以上の引数が null。
1 つ以上の引数が範囲外です。
reservations は、このレコード シーケンスによって作成されませんでした。
レコード シーケンスが読み取り専用アクセスで開かれたため、操作を実行できません。
予期しない I/O 例外のため、要求を実行できませんでした。
シーケンスが破棄された後、メソッドが呼び出されました。
プログラムの実行を続行するのに十分なメモリがありません。
レコード シーケンスがいっぱいです。
dataに収まる大きさの予約は、reservationsで見つかりません。
注釈
data パラメーターに含まれるデータは、レコードとして追加するために 1 バイト配列に連結されます。 ただし、レコードの読み取り時にデータを配列セグメントに分割するためのプロビジョニングは行われません。
追加されたレコードは、 reservations パラメーターで指定された予約を使用して、以前に予約された領域を消費します。 追加が成功すると、データを保持できる最小の予約領域が使用され、その予約領域がコレクションから削除されます。
通常、このメソッドはレコードが書き込まれる前に完了します。 レコードが確実に書き込まれるようにするには、ForceFlush パラメーターを使用して recordAppendOptions フラグを指定するか、Flush メソッドを呼び出します。