【问题标题】:File.Copy hangs on corrupt fileFile.Copy 挂在损坏的文件上
【发布时间】:2011-06-10 02:22:26
【问题描述】:

我一直在尝试将文件从旧驱动器复制到新驱动器。问题是,旧驱动器(我只能假设)磁盘上有一些损坏的地方,任何从其中一些文件中读取的尝试都会导致似乎是某种无限循环。在我要复制的文件中散布着很多问题文件,当它遇到第一个时,我的应用程序只是坐在那里什么都不做,直到我停止它。我希望我可以通过编写一个自定义程序来递归遍历目录,一个一个地复制文件,并捕获在单个复制操作中弹出的任何错误来解决这个问题,但它永远不会引发错误 - -只是坐在那里,坐在那里,坐在那里。阻止这种情况的唯一方法是物理关闭有问题的硬盘驱动器 - 无法通过尝试结束进程或类似的方式来停止程序。

我对如何继续感到有些困惑。鉴于这种错误将会发生,有没有办法自动化这个过程?有人有这方面的经验吗?

【问题讨论】:

  • 这是一个内核模式问题。我认为您对此无能为力。

标签: c# hard-drive .net


【解决方案1】:

当 HD 严重损坏并且 HD 需要很长时间才能响应时,可能会发生这种情况。通常,当您遇到 CRC 错误时,就会发生这种情况,并且发生在具有大量扇区的大文件上。

您应该考虑使用较低级别的查看扇区的方法,这样您就可以更好地控制何时停止。

虽然有一些程序旨在完全按照您的要求进行操作,但可能更易于使用(只需在 google 上搜索数据恢复)。有些将具有更有可能恢复您的数据的特殊功能。有些是相当先进的特殊算法等。

【讨论】:

    【解决方案2】:

    我猜你在标准 System.IO 类(Directory / DirectoryInfo / File / FileInfo)上使用了复制方法?

    您是否尝试使用 FileStream 复制文件?为了防止这些错误,您可以在流上设置 ReadTimeout (stream.ReadTimeout)。这样,当 Read() 操作花费太长时间时,您会得到异常。如果文件无法打开,您也会收到错误消息。

    【讨论】:

    • 一点谷歌搜索说您只能将该属性用于网络读取,而不是本地文件系统读取。当我尝试您的方式时,我收到“此流不支持超时”错误,并且一切都失败了。好主意。
    • 对不起,你是对的。怎么样:从 FileStream 派生;实现 ReadTimeout 并覆盖 Read(..) 它在花费太长时间时抛出异常?
    【解决方案3】:

    您应该寻找一种数据恢复工具,而不是一些技巧,以便在 C# 中获得强大的复制过程...

    如果您的旧驱动器没有损坏(发出叮当声),那么您应该尝试使用chkdsk 恢复文件系统。

    如果有 chkdsk 无法处理的问题,您需要像 ddrescue 或任何其他的数据恢复工具(尝试谷歌“数据恢复”或“从损坏的磁盘复制文件”)。

    【讨论】:

    • 那是一个 Unix 程序?我在 Windows 上。
    • 你先尝试过 chkdsk 吗?这是windows内置的文件系统修正工具。
    【解决方案4】:

    我认为 CBD(Copy Bad Disk) 正是您所需要的:在坏扇区上复制文件而不会挂起或停止,不可读字节的日志位置等。

    【讨论】:

      【解决方案5】:

      对于像我这样偶然发现这个旧线程的人,在通过无线网络连接复制一些较大的文件 (~1GB) 时遇到类似的问题:我的 WLAN 适配器有一个驱动程序设置“多媒体/游戏环境”。当此设置为“启用”时,大文件在通过 WLAN 复制时通常会损坏。将“多媒体/游戏环境”设置为“禁用”后,问题就消失了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-27
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 2017-12-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多