0

この記事に含まれるクラスを使用して、C# で小さなテープ ライター アプリケーションを作成しています: http://www.codeproject.com/Articles/15487/Magnetic-Tape-Data-Storage-Part-1-Tape-Drive-IO -コ

これは非常にうまく機能しますが、元のファイル データよりも多くのデータがテープに書き込まれます。

実際の例: 私のテスト ファイルは 160MB です。テープに書き込むと、約 300MB のスペースが占有されます。ハードウェア圧縮を有効にすると、約 250 MB かかります。

書き込んだばかりの生データをテープから読み取ると、約 170 MB のファイルが得られ (魔女でもかまいません)、バックアップされたファイルは常に正常に機能します。

他のプログラムで試してみたところ、Microsoft NTBackup は圧縮を有効にして 170 MB (!!) しか使用せず、他の商用および無料プログラムは 200 から 300 MB を使用しました。

しかし、すべてのプログラムはバックアップを正しく読み取ることができます (復元されたファイルの同じ md5 と sha1!)

どうしたの?アプリケーションを改善するにはどうすればよいですか? 私は本当にこれを理解できません。

クラスで変更された書き込みを使用する「書き込み」関数を追加します (これは、単一のファイルを書き込む場合にのみ機能します)。

private void Write(string path)
{

    int BlockCounter = 0;
    int BytesRead = 0;
    Byte[] Temp = new Byte[BUFFER_SIZE];

    using (System.IO.FileStream InputStream = System.IO.File.OpenRead(path))
    {
        TapeOperator TapeOp = new TapeOperator();
        TapeOp.Load("\\\\.\\Tape0", 0);
        TapeOp.SetTapePosition(0);
        BytesRead = InputStream.Read(Temp, 0, BUFFER_SIZE);
        while (BytesRead > 0)
        {
            TapeOp.Write(BlockCounter, Temp);
            BlockCounter++;
            BytesRead = InputStream.Read(Temp, 0, BUFFER_SIZE);
        } 
        TapeOp.TapeMark(1, 1, 1); //TapeMark is a custom function to write a FileMark
        BlockCounter++;

        TapeOp.Close();
    }            

}

クラスからの変更された書き込み:

public void Write(long startPos, byte[] stream)
{
    m_stream.Write(stream, 0, stream.Length);
    m_stream.Flush();
}
4

1 に答える 1

0

私の見解では、テープのブロック サイズが BUFFER_SIZE よりも大きいということです。テープ ブロックを完全に埋めていません。

于 2014-02-08T06:06:41.980 に答える