2013-02-14 2 views
0

я пишу небольшое приложение писателя ленты в C#, используя класс, содержащийся в этой статье: http://www.codeproject.com/Articles/15487/Magnetic-Tape-Data-Storage-Part-1-Tape-Drive-IO-CoЗачем изменять размер архива для каждой программы, которую я использую?

это работает очень хорошо, но пишет много больше данных на магнитной ленте, чем исходные данные файла.

Оценка: Мой тестовый файл - 160mb. Запись в ленте приводит к занятию около 300 мб. , обеспечивающий сжатие оборудования, занимает около 250 МБ.

Если я прочитал только что написал необработанные данные с ленты, я получу около 170 Мб файла (ведьма приемлема), и резервный файл всегда работает хорошо.

Я попытался с другими программами, Microsoft NTBackup использует только 170MB (!!) со сжатием включена, другие коммерческие и бесплатные программы использует от 200 до 300Mb

Но все программы могут читать правильно подпорку (то же самое и md5 sha1 на восстановленном файле!)

Что происходит? как я могу улучшить свое приложение? я действительно не могу этого понять.

я добавить свою функцию «запись», который использует Modded запись в классе (это работает только, если вы пишете один файл):

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(); 
    }    

} 

Modded записи из класса:

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

ответ

0

Я бы взял на себя размер блока ленты больше, чем ваш BUFFER_SIZE. Вы не заполняете ленточные блоки полностью.

+0

Добавьте это как комментарий, а не как ответ. – InnocentKiller

+0

В этом тесте я использовал один файл размером 160 Мбайт, поэтому размер блока не может помочь! Спасибо, в любом случае :) Похоже, что последнее измерение связано с количеством ошибок записи на магнитной ленте, и есть какой-то способ уменьшить этот номер ошибки со стороны программного обеспечения (например, Microsoft NTBackup). – HypeZ

Смежные вопросы