如何使用Perl将数据从有缺陷的DVD复制到我的硬盘?

时间:2010-07-16 13:39:05

标签: perl copy checksum crc

情况是这样的:我的系统(Win XP Pro)无法从DVD磁盘复制一个巨大的视频文件(大约6演出),这可能是有缺陷的,有划痕的或者其他什么,但可以用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 个答案:

答案 0 :(得分:5)

你想要ddrescue,不需要重新发明那个轮子。

您的程序中的

readline不够低,必须使用sysread而不是指定偏移可以指定在读取部分失败后拾取。