いくつかのデータをテープ ドライブに書き込もうとしています - ここにあるクラスを使用しています: http://www.codeproject.com/Articles/15487/Magnetic-Tape-Data-Storage-Part-1-Tape-Drive- IO-Co
「ロード」メソッドを使用してテープ ドライブを正常にロードできますが、テープに書き込もうとすると次のエラーが発生します。
IO 操作は機能しません。ほとんどの場合、ファイルが長くなりすぎるか、同期 IO 操作をサポートするためにハンドルが開かれていません。
この問題は、不適切なブロック サイズを使用するファイル ハンドルが原因であると考えられます。デバイスのブロック サイズが 32768 であることはわかっていますが、このブロック サイズを使用してファイル ハンドルを開くにはどうすればよいですか?
TapeOperator TapeOperatorObject = new TapeOperator();
// Load tape 1
TapeOperatorObject.Load(@"\\.\Tape1");
// Write to tape drive
Console.WriteLine("Writing");
FileStream inputFile = new FileStream("test.txt", FileMode.Open);
TapeOperatorObject.Write(0, ReadFully(inputFile));
public static byte[] ReadFully(Stream input)
{
byte[] buffer = new byte[16 * 1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
私が使用しているクラスの Write メソッドは次のとおりです。
/// <summary>
/// Writes to the tape given stream starting from given postion
/// </summary>
/// <param name="startPos"></param>
/// <param name="stream"></param>
public void Write( long startPos, byte[] stream )
{
// Get number of blocks that will be nned to perform write
uint numberOfBlocks = GetBlocksNumber( stream.Length );
// Updates tape's current position
SetTapePosition( startPos );
byte[] arrayToWrite = new byte[ numberOfBlocks * BlockSize ];
Array.Copy( stream, arrayToWrite, stream.Length );
// Write data to the device
m_stream.Write( stream, 0, stream.Length );
m_stream.Flush();
}
ありがとう
- デビッド