需要磁盘访问程序的建议

mik*_*ato 2 programming-languages disk

我正在设想一个我需要编写的程序,并且需要一些关于语言的建议。我将需要进行原始磁盘访问,以便我可以显示十六进制数据,在磁盘上滚动或跳转,并根据数据进行计算。我一直在使用 Java,它在我的其他项目的操作系统之间的可移植性当然是一个好处,但是原始磁盘访问要么是不可能的,要么需要 JNI,或者当您可以将磁盘作为“文件”访问时,可能在 *nix 上是可能的”。我一直在读不同的东西。顺便说一下,我可以使用 Java 中的文件处理此类工作,但在此项目中,我需要能够访问磁盘,因此不需要事先对文件进行磁盘映像。

让它尽可能便携会很好,因为使用不同的操作系统有真正的好处,但它可能不值得,我应该坚持使用 Windows 和本地编译语言。是否有任何现有的 JNI 代码可以提供帮助?我有其他语言的经验,但我很长时间没有使用 C++。我应该忘记 Java 并尝试 C# 吗?有人告诉我,尽管 Python 是一种解释型语言,但它有可用于此类事物的库,那么 Python 呢?什么最适合该项目?学什么对我有好处?

四处搜索原始磁盘访问、Java、Python 似乎没有给出任何有用的结果。谢谢你的帮助!

编辑 看起来这会很复杂,学习我需要知道的东西,然后学习。太糟糕了,我不能使用磁盘映像来代替,因为这样我就可以立即用 Java 开始处理它,我对此很满意,而且我知道我可以制作出好的产品。我在其他使用 Java 的原始数据处理项目中获得了很大的吞吐量,所以我不用担心。此外,它将真正便携。嗯,可能要多考虑了。不过,我可能需要一个大的 azz 存储系统来保存所有图像:)

更新 只是对发现这个问题的任何人的说明......我发现这只是通过使用 PhysicalDrive 表示法(在 Windows 中)指定文件的磁盘来工作,就像下面由 hunsricker 提供的答案。不过也有一些问题。首先,如果您执行“存在”检查 File.exists(),它表示该文件不存在。此外,文件大小为零,当我收到“java.io.IOException:驱动器找不到请求的扇区”时,我知道我在文件末尾。最糟糕的是 - 当我在循环中读取一些字节并跳过一些(64)字节时,我遇到了一些奇怪的运行时错误。我稍微修改了我的程序以读取不同的数量,这改变了发生错误的位置。顺便说一下,我使用的是 BufferedInputStream 而不是 RandomAccessFile 就像下面的 hunsricker,不知道它是否有所作为。我对这个问题的唯一答案是,由于我正在进行物理磁盘访问,因此我不喜欢甚至没有读取 512 字节扇区或 1K 块等。事实上,当我读取 1K、2K、512 字节等,并且不跳过任何内容时,它工作正常并运行到最后。我看到的错误是 java.io.ioexception“函数不正确”和 java.io.ioexception“参数不正确”。他们没有韵律或理由。然后我制作了相同数据的图像文件并在这些文件上运行我的程序,它可以毫无问题地执行读取和跳过字节的任何组合。我猜物理磁盘访问更挑剔。事实上,当我读取 1K、2K、512 字节等,并且不跳过任何内容时,它工作正常并运行到最后。我看到的错误是 java.io.ioexception“函数不正确”和 java.io.ioexception“参数不正确”。他们没有韵律或理由。然后我制作了相同数据的图像文件并在这些文件上运行我的程序,它可以毫无问题地执行读取和跳过字节的任何组合。我猜物理磁盘访问更挑剔。事实上,当我读取 1K、2K、512 字节等,并且不跳过任何内容时,它工作正常并运行到最后。我看到的错误是 java.io.ioexception“函数不正确”和 java.io.ioexception“参数不正确”。他们没有韵律或理由。然后我制作了相同数据的图像文件并在这些文件上运行我的程序,它可以毫无问题地执行读取和跳过字节的任何组合。我猜物理磁盘访问更挑剔。然后我制作了相同数据的图像文件并在这些文件上运行我的程序,它可以毫无问题地执行读取和跳过字节的任何组合。我猜物理磁盘访问更挑剔。然后我制作了相同数据的图像文件并在这些文件上运行我的程序,它可以毫无问题地执行读取和跳过字节的任何组合。我猜物理磁盘访问更挑剔。

小智 5

我一直在寻找访问物理驱动器原始数据的可能性。现在,当我开始使用它时,我只想告诉您如何操作。您可以直接从 java 中访问原始磁盘数据……只需以管理员权限运行以下代码:

    File diskRoot = new File ("\\\\.\\PhysicalDrive0");
    RandomAccessFile diskAccess = new RandomAccessFile (diskRoot, "r");
    byte[] content = new byte[1024];
    diskAccess.readFully (content);
Run Code Online (Sandbox Code Playgroud)

因此,您将获得系统上第一个物理驱动器的第一个 kB。要访问逻辑驱动器 - 如上所述 - 只需将“PhysicalDrive0”替换为驱动器号,例如“D:”

哦,是的......我在Win 7系统上尝试过Java 1.7......

RageDs 链接让我找到了解决方案......谢谢:-)