1

いくつかのデータをテープ ドライブに書き込もうとしています - ここにあるクラスを使用しています: 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();
        }

ありがとう

  • デビッド
4

0 に答える 0