1

すべてのレコードが保存されているシリアル化されたファイルを開いています。このコードは、現在のレコードのオブジェクト ID 番号プロパティとそれぞれのテキスト ボックス内の番号との一致を見つけます。一致する場合はレコードを削除したい。これを行う最良の方法は?

Item readItem = new Item();
BinaryFormatter bFormatter = new BinaryFormatter();
FileStream inFile = new FileStream(@"C:\file.dat", FileMode.Open, FileAccess.Read);

while (inFile.Position < inFile.Length)
    readItem = (Item)bFormatter.Deserialize(inFile);
    if (readItem.ID.ToString() == IDTextBox.Text)
{

    ??????

 }
4

2 に答える 2

2

ファイルを逆シリアル化し、リストからアイテムを削除してから、すべてを再シリアル化する必要があります。SQLLiteのようなファイルベースのデータベースを使用し、レコードを行内のblobにシリアル化する方がよいでしょう。

于 2011-11-30T19:26:36.750 に答える
1

固定サイズのレコードがあるか、さまざまなサイズのレコードがあるかによって異なります。

さまざまなサイズのレコード

さて、あなたがする必要があるのは、あなたが取り除きたいレコードに続くファイルのすべてのコンテンツを上に移動し、あなたが削除したい部分を上書きしてから、ファイルを切り捨てることです。これをインプレースで(つまり、同じファイル内で)行うのは少し難しいです。これは、上への移動ループを繰り返すたびにファイルの残りの部分が上書きされないようにするために十分なデータしか読み取れないためです。

古いファイルから新しいファイルを作成する簡単な方法は次のとおりです。

  1. アイテムを逆シリアル化する前に、ストリームの位置をメモしてください
  2. アイテムが一致する場合は、現在のストリームの位置をメモします(2つの位置は、削除するレコードが存在するファイルの領域を示します)
  3. 新しいファイルを作成し、最初から、最初の位置と同じバイト数を、古いストリーム(レコードを見つけたストリーム)から新しいストリームにコピーします。
  4. 見つけたレコードの後に​​メモした位置に古いストリームを配置し、そこから見つけたすべてのものを新しいストリームにコピーします

これにより、削除するレコードをスキップすることを除いて、古いファイルと同じ内容の新しいファイルが作成されます。

すべてのレコードをループして、それを保持するかどうかを単純に決定できる場合は、さらに簡単な方法を次に示します。

  1. 新しいストリームを開く
  2. 古いストリームからアイテムを逆シリアル化します
  3. 保持したい場合は、シリアル化して新しいストリームに戻します
  4. 残りのアイテムについても同様です。

固定サイズのレコード

ファイルの最後のレコードを読み取り、削除するレコードの位置にファイルを戻し、最後に読み取ったレコードの内容で上書きしてから、ファイルの最後のレコードの直前でファイルを切り捨てるだけです。ファイル。

于 2011-11-30T19:21:09.147 に答える