2013-07-16 29 views
4

好的,請相信我,我有這個想法。也許不使用Java,但有。我能夠生訪問在Windows 7上使用UNC風格的路徑磁盤,例如:如何通過寫入權限在Java中獲得原始磁盤訪問 - Windows 7

RandomAccessFile raf = null; 
    try { 
     raf = new RandomAccessFile("\\\\.\\PhysicalDrive0","r"); 
     byte [] block = new byte [2048]; 
     raf.seek(0); 
     raf.readFully(block); 
     System.out.println("READ BYTES RAW:\n" + new String(block)); 
    } catch (IOException ioe) { 
     System.out.println("File not found or access denied. Cause: " + ioe.getMessage()); 
     return; 
    } finally { 
     try { 
      if (raf != null) raf.close(); 
      System.out.println("Exiting..."); 
     } catch (IOException ioe) { 
      System.out.println("That was bad."); 
     } 
    } 

但是如果我切換到「RW」模式,一個NullPointerException出現,甚至我運行程序作爲管理員,我沒有得到原始寫入磁盤的句柄。我知道這已經被問到了,但主要是爲了閱讀......所以,寫什麼呢?我需要JNI嗎?如果是這樣,有什麼建議?

乾杯

+0

同樣的問題。在我的例子中,java.io.FileNotFoundException:\\。\ GLOBALROOT \ ArcName \ multi(0)disk(0)rdisk(0)分區(5)(Falscher參數)在java.io.RandomAccessFile。在java.io.RandomAccessFile中打開(Native Method)。 (未知來源)'希望這有助於找到解決方案。 '「r」'也能正常工作 –

+1

@DanielAlder好像你後來解決了它。 http://stackoverflow.com/a/19723977/1378620 – Robert

回答

2

您的問題是new RandomAccessFile(drivepath, "rw")使用標誌,他們是不是原始設備兼容。對於寫這樣的設備,你需要的Java 7和它的新nio類:

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(); 

(從另一個(類似拍攝答案)question)這裏

相關問題