You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:05:00