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
パラメーターに格納されたデータは、レコードとして追加するために単一バイトの配列に連結されます。 ただし、レコードの読み取り時にデータを分割して配列セグメントに戻す準備は実施されません。
このメソッドは通常、レコードの書き込みが終わる前に完了します。 レコードが書き込まれたことを確認するために、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
パラメーターに格納されたデータは、レコードとして追加するために単一バイトの配列に連結されます。 ただし、レコードの読み取り時にデータを分割して配列セグメントに戻す準備は実施されません。
このメソッドは通常、レコードの書き込みが終わる前に完了します。 レコードが書き込まれたことを確認するために、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
パラメーターに格納されたデータは、レコードとして追加するために単一バイトの配列に連結されます。 ただし、レコードの読み取り時にデータを分割して配列セグメントに戻す準備は実施されません。
追加されたレコードは、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
パラメーターに格納されたデータは、レコードとして追加するために単一バイトの配列に連結されます。 ただし、レコードの読み取り時にデータを分割して配列セグメントに戻す準備は実施されません。
追加されたレコードは、reservations
パラメーターにより指定された予約を使用して以前に予約された領域を消費します。 この追加処理が成功すると、データを格納できる最も小さな予約領域が消費され、その予約領域がコレクションから削除されます。
このメソッドは通常、レコードの書き込みが終わる前に完了します。 レコードが書き込まれたことを確認するために、ForceFlush パラメーターを使用して recordAppendOptions
フラグを指定するか、Flush メソッドを呼び出します。
適用対象
.NET