我正在尝试使用以下代码访问原始磁盘中偏移量为50字节的一个字节.
randomAccessFile = new RandomAccessFile("C:", "r");
randomAccessFile.seek(50);
byte[] buffer = new byte[1];
randomAccessFile.read(buffer);
Run Code Online (Sandbox Code Playgroud)
但我得到的是以下错误:
java.io.FileNotFoundException: C: (Acceso denegado)
at java.io.RandomAccessFile.open(Native Method)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:212)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:98)
at pru.lseek.main(lseek.java:26)
Run Code Online (Sandbox Code Playgroud)
有没有办法从java访问驱动器中的精确字节?
小智 16
我一直在寻找从物理驱动器访问原始数据的可能性.现在,当我开始工作时,我只想告诉你如何.您可以直接从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 ...
请访问http://support.microsoft.com/kb/100027/en-us,查看物理驱动器的命名
Dan*_*der 10
如果您有兴趣在Windows下写入原始卷,请尝试此操作(需要Java 7).
String pathname;
// Full drive:
// pathname = "\\\\.\\PhysicalDrive0";
// A partition (also works if windows doesn't recognize it):
pathname = "\\\\.\\GLOBALROOT\\ArcName\\multi(0)disk(0)rdisk(0)partition(5)";
Path diskRoot = ( new File( pathname ) ).toPath();
FileChannel fc = FileChannel.open( diskRoot, StandardOpenOption.READ,
StandardOpenOption.WRITE );
ByteBuffer bb = ByteBuffer.allocate( 4096 );
fc.position( 4096 );
fc.read( bb );
fc.position( 4096 );
fc.write( bb );
fc.close();
Run Code Online (Sandbox Code Playgroud)
当然,您必须确保设备是可写的,而不是系统访问/锁定.还要确保您的应用程序以必要的权限(提升的权限)运行.
顺便说一下:使用new RandomAccessFile(drive, "rw")似乎不起作用,因为Java没有以与原始设备兼容的模式打开文件句柄(例外java.io.FileNotFoundException (The parameter is incorrect)).但阅读效果也很好RandomAccessFile.
RandomAccessFile 并不意味着打开目录来操作条目,您需要创建或删除文件。“Acceso denegado”可能意味着访问被拒绝。无论如何,要执行此操作,您需要 JNI。
编辑:您想要做的事情确实很复杂,没有通用的方法可以做到这一点。您可以逐扇区访问硬盘,但是您必须解释它的结构,这显然取决于文件系统,FAT、NTFS、HPFS 等。
| 归档时间: |
|
| 查看次数: |
15186 次 |
| 最近记录: |