Как скопировать данные с неисправного DVD на жесткий диск с помощью Perl? - PullRequest
0 голосов
/ 16 июля 2010

Ситуация такова: моя система (Win XP Pro) не может скопировать огромный видеофайл (около 6 гигабайт) с диска DVD, который может быть поврежден, поцарапан или что-то еще, но который может быть воспроизведен с помощью mplayer с хотя несколько кадров полно мозаики. Когда процесс копирования длился определенный промежуток времени, система прервала работу и выдала мне предупреждение «Произошла ошибка контрольной суммы проверки циклическим избыточным кодом». И тогда все скопированное было автоматически удалено.

Я думаю, что Perl-приложение может решить эту проблему. Моя мысль такова: я копирую видеоданные по одному мегабайту за раз. Если когда-нибудь произойдет ошибка чтения, я позволю perl игнорировать этот конкретный 1 мегабайт данных и продолжаю копировать оставшуюся часть видео по одному мегапиксельному за раз.

Кстати, я также заметил, что некоторые коммерческие программы могут выполнять эту работу, но в испытаниях есть ограничения.

Следующий скрипт - это то, что я пробовал до сих пор. Он копирует данные по одному мегабайту за раз с дефектного диска DVD, но не работает, как Win XP. Разница лишь в том, что Perl не удаляет то, что уже было скопировано. В моем случае он скопировал около 900 мегабайт видеоданных на мой жесткий диск, и эту 900-мегапиксельную часть видео все еще можно воспроизвести с помощью mplayer. Но моя цель - скопировать все хорошее, большинство, оставив только плохое меньшинство.

    use strict;
    use warnings;

    $/ = \1_048_576;  

    open my $in, "<", 'D:\tobecopied.mkv' or die $!;
        binmode $in;
    open my $out, ">", 'E:\copied.mkv' or die $!;
        binmode $out;

    while (<$in>) {
        print $out $_;
    }

Проблема в том, что я не знаю, как этого добиться. Надеюсь, что кто-то здесь может дать мне подсказку или подсказку. Спасибо, как всегда :)

1 Ответ

5 голосов
/ 16 июля 2010

Вы хотите ddrescue , не нужно сильно изобретать это колесо.

readline в вашей программе недостаточно низкоуровневый, вместо него следует использовать sysread, где можно указать смещение, которое можно получить после сбоя чтения части.

...