需要有关磁盘访问程序的建议

时间:2011-11-18 18:26:40

标签: programming-languages disk

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

尽管使用不同的操作系统有一个真正的好处,但我可以随心所欲地使用它,但它可能不值得,我应该坚持使用Windows和本机编译语言。是否有任何现有的JNI代码可以提供帮助?我有其他语言的经验,但我很长时间没有使用过C ++。我应该忘记Java并试用C#吗?有人告诉我,虽然Python是一种解释型语言,但Python有可用于这种类型的库,那么Python呢?什么是最好的项目?什么对我有好处?

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

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

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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

RageDs链接让我感到满意...谢谢: - )

答案 1 :(得分:0)

磁盘访问权限取决于磁盘的特定驱动程序。由于这是一个如此低级别的任务,我怀疑Java / Python会有这样的支持(这些语言通常用于快速,高级的软件包开发)。由于您可能不了解磁盘的特定硬件实现,因此您可能不得不最终使用操作系统API(当然,这取决于操作系统)。我建议您查看C和/或您计划执行此工作的体系结构的特定汇编语言。然后,我建议继续搜索,为目标操作系统找到合适的API。

修改

对于Windows,一个好的起点是here。更具体地说,MSDN的CreateFile()可能是您感兴趣的函数。