Windows 10下如何读写物理磁盘(USB)?寻求Go语言实现方案
在Windows下用Go语言读写物理磁盘(USB设备)未分配区域
核心前提与新版Windows限制
- 必须以管理员权限运行程序,普通权限无法访问物理设备路径
- 新版Windows(Win10/11)仍支持
\\.\PhysicalDriveN路径,但需规避磁盘锁定:- 关闭Windows快速启动(否则磁盘会处于休眠锁定状态,无法独占访问)
- 确保目标磁盘未被挂载(未分配区域本身无挂载,相对安全;若有已挂载分区需先卸载)
- 无其他进程占用该磁盘(比如磁盘管理工具、杀毒软件扫描等)
Go语言实现示例
以下代码实现读取物理磁盘前20字节,再写入测试数据(请替换N为实际磁盘编号,可通过diskpart的list disk命令查询):
package main import ( "fmt" "os" "syscall" ) func main() { // 替换为目标物理磁盘路径,比如\\.\PhysicalDrive1 diskPath := `\\.\PhysicalDriveN` // 打开物理磁盘:O_RDWR表示读写,syscall.O_EXCL表示独占访问(避免被其他进程占用) file, err := os.OpenFile(diskPath, os.O_RDWR|syscall.O_EXCL, 0666) if err != nil { fmt.Printf("打开磁盘失败: %v\n", err) fmt.Println("可能原因:权限不足(需管理员运行)、磁盘被占用、快速启动未关闭") return } defer file.Close() // 读取前20字节 buf := make([]byte, 20) n, err := file.ReadAt(buf, 0) if err != nil { fmt.Printf("读取磁盘失败: %v\n", err) return } fmt.Printf("成功读取%d字节: %x\n", n, buf) // 写入测试数据(注意:此操作会覆盖磁盘对应位置的数据,务必谨慎!) testData := []byte("TEST_PHYSICAL_DISK") n, err = file.WriteAt(testData, 0) if err != nil { fmt.Printf("写入磁盘失败: %v\n", err) return } fmt.Printf("成功写入%d字节\n", n) // 验证写入结果 verifyBuf := make([]byte, len(testData)) n, err = file.ReadAt(verifyBuf, 0) if err != nil { fmt.Printf("验证写入失败: %v\n", err) return } fmt.Printf("验证数据: %s\n", verifyBuf) }
关键注意事项
- 磁盘编号确认:通过
diskpart命令进入交互模式,执行list disk查看磁盘编号,绝对不要选错磁盘(否则会损坏数据) - 未分配区域读写:若要读写未分配区域,需计算该区域的起始偏移量(比如MBR占用前512字节,若未分配区域从第513字节开始,就将
ReadAt/WriteAt的偏移参数设为512) - 数据安全:物理磁盘读写直接操作原始扇区,任何错误操作都会导致数据永久丢失,建议先在空的测试USB设备上验证
- 权限与锁定:若打开磁盘提示“拒绝访问”,检查是否管理员运行、快速启动是否关闭、磁盘是否被其他进程占用
内容的提问来源于stack exchange,提问作者Zpon
相关产品推荐
相关产品推荐

