大文件:在外部 HD 上时无法读取

Posted

技术标签:

【中文标题】大文件:在外部 HD 上时无法读取【英文标题】:Large files: impossible to read when they are on an external HD 【发布时间】:2012-10-06 17:52:02 【问题描述】:

我有这个简单的代码:

using(FileStream fs = new FileStream(@"E:\test.bin", FileMode.Open, FileAccess.Read, FileShare.Read)

    byte[] bytes = new byte[100];
    int n = fileStream.Read(bytes, 0, bytes.Length);

通常按预期工作,返回文件开头的字节数组。

令人难以置信的是,当我尝试读取位于通过 USB 连接的外部 HD 上的一个相当大的文件 (~7GB) 时,返回数组中的字节全为零 并且 n 为 100。

如果我尝试使用相同类型但较小的文件,一切正常。如果我在另一个外部 HD 上尝试相同的大文件,那么一切都很好。更令人难以置信的是,如果我尝试使用相同的大文件并使用相同的外部 HD,这会给我带来问题,但通过 eSATA 连接一切正常

两个 HD 都是 NTFS 并且在有问题的 HD 上描述的行为不是 100% 稳定的:有时 7GB 左右的文件不被读取,有时它们是;永远不会读取大约 10GB 的文件。

有什么可能导致此问题以及如何解决它的想法吗?


编辑: 我已经尝试读取 1GB 的数据,但没有任何变化。但这里还有其他提示:如果文件太大,读取 1GB 字节的时间太短,无法真正读取;此外,如果我等待 HD 进入待机模式,并且如果我尝试从小文件中读取 1GB,则 HD 退出待机,读取需要时间并成功,而如果我尝试使用大文件,则 HD 不会退出睡眠模式,读取需要几毫秒,然后再次全为零。

如果我用一些值初始化字节数组,这些值会在“假”读取后被删除,并且我再次全为 0。

【问题讨论】:

如果你在阅读之前做一个fileStream.Seek(0, SeekOrigin.Begin);呢? @AlvinWong 感谢您的建议。我已经尝试过了,但没有成功。 哇...您是否尝试过读取大于 100 字节的数据?说1MB甚至1GB?我很想知道到底发生了什么…… 哦,只是为了确保......你确定前 100 个字节确实不是 0 吗? 其他程序可以读取文件吗?如果其他程序可以读取它但您的程序不能,那么我会怀疑您的代码。如果其他程序也有同样的问题,那么几乎可以肯定是硬件问题。 【参考方案1】:

鉴于相同的代码在某些驱动器上运行良好,并且您无法控制驱动器如何通过 USB 或其他方式工作,我想这只是硬件问题。尝试在另一台计算机上使用相同的驱动器运行程序。

【讨论】:

好的,谢谢,这是一个硬件问题,但即使在这种情况下,我也不希望有 n = 100(读取字节数)。在我看来,n 应该是 0。 @Ganswer Windows 只是读取文件内容,它不知道这是硬件问题,因此无论从底层驱动程序接收到什么,它都会返回给您。

以上是关于大文件:在外部 HD 上时无法读取的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot REST Controller 部署在外部 tomcat 9 服务器上时返回 404

在外部 js 文件中使用会话

Android14.2 外部文件存储和读取

无法在外部 tomcat 上部署 Spring Boot 应用程序

如何使用 typescript 在外部 js 文件中调用函数

Docker容器数据卷挂载使用