2014-01-09 136 views
6

想知道是否有人嘗試過低級磁盤I/O,比如讀取原始扇區,MBR等。我已經做了一些圍繞自己的挖掘工作,無法找到任何關於它的提及。大部分情況是有人談論Go的本地io包的死衚衕。Golang的低級磁盤I/O

任何線索將不勝感激。

+0

On * nix你可以在/ dev/ – nos

+0

中讀取/寫入原始設備文件是的,但是如果有跨平臺的方式來做這件事,那麼會很好,因爲Go是跨平臺的......沒有用C語言編寫所有代碼,儘管如果需要可能。 '/ dev /'文件對我來說可以,因爲我在任何地方都運行* NIX。不過,我知道它們不存在於Windows中。 – Sly

+4

不存在這樣的跨平臺API,至少不適用於Go。 btw窗口在\\。\命名空間中有特殊文件,例如\\。\ PhysicalDisk0或\ Device \ XXX \ – nos

回答

4

我還是新的去,所以我的例子不是特別優雅,但我認爲這是你想要什麼:

package main 

import (
    "syscall" 
    "fmt" 
) 

func main() { 
    disk := "/dev/sda" 
    var fd, numread int 
    var err error 

    fd, err = syscall.Open(disk, syscall.O_RDONLY, 0777) 

    if err != nil { 
     fmt.Print(err.Error(), "\n") 
     return 
    } 

    buffer := make([]byte, 10, 100) 

    numread, err = syscall.Read(fd, buffer) 

    if err != nil { 
     fmt.Print(err.Error(), "\n") 
    } 

    fmt.Printf("Numbytes read: %d\n", numread) 
    fmt.Printf("Buffer: %b\n", buffer) 

    err = syscall.Close(fd) 

    if err != nil { 
     fmt.Print(err.Error(), "\n") 
    } 
} 

這裏是一個系統調用包文檔的鏈接:http://golang.org/pkg/syscall/

根據在這個頁面上,這個軟件包試圖與儘可能多的不同平臺兼容,但是我的新手眼睛看起來好像主要目標是Linux API,當然,它使用習慣用法來簡化事情。我希望這回答了你的問題!

+0

還沒有機會檢查這一點,但無論如何努力。 :D – Sly

+0

我給了它更多的想法,實際上我認爲這並不是特別遵循Linux API,除非這些系統調用函數的命名方式相似 - 我真的不知道其他操作系統是否有足夠的評論關於名稱是否匹配。例如,即使調用實際上沒有創建文件,「syscall.Open」函數也總是需要'mode'參數。 – waynr