Go1.8操作Windows硬盘小实例
来源:互联网 发布:星际皆知你爱我txt 编辑:程序博客网 时间:2024/06/12 14:55
package main// #include <stdlib.h>import "C"import ( "bytes" "errors" "os" "syscall" "unsafe")var ( success = "The operation completed successfully." kernel = syscall.NewLazyDLL("Kernel32.dll") setVolumeMountPoint = kernel.NewProc("SetVolumeMountPointA") getValumeNameForMount = kernel.NewProc("GetVolumeNameForVolumeMountPointA") deleteVolumeMountPoint = kernel.NewProc("DeleteVolumeMountPointA"))func main() { defer syscall.CloseHandle(syscall.Handle(kernel.Handle())) if len(os.Args) != 3 { usage() } if os.Args[1] == "-d" { let := os.Args[2] if len(let) != 1 { println("盘符不正确,确认盘符格式:-d D格式") return } let += ":\\" err := delVolumeMount(let) if err != nil { println(err.Error()) } return } err := ChangeLetter(os.Args[1], os.Args[2]) if err != nil { println(err.Error()) }}//ChangeLetter("E","G")func ChangeLetter(oldLetter, newLetter string) error { if len(oldLetter) > 1 || len(newLetter) != 1 { return errors.New("盘符不正确,确认盘符格式:C,D格式") } oldLetter += ":\\" newLetter += ":\\" volumeID, err := getValumeName(oldLetter) if err != nil { return err } println("获取到 volume id:", volumeID) err = delVolumeMount(oldLetter) if err != nil { return err } return setVolumeMount(newLetter, volumeID)}//getValumeName("D:\\")func getValumeName(letter string) (string, error) { char := C.CString(letter) defer C.free(unsafe.Pointer(char)) n := make([]byte, 254) _, _, err := getValumeNameForMount.Call(uintptr(unsafe.Pointer(char)), uintptr(unsafe.Pointer(&n[0])), 254) if err.Error() != "More data is available." { return "", err } return string(n[:bytes.Index(n, []byte{0})]), nil}//setVolumeMount("G:\\", `\\?\Volume{3a7aa2c9-5dfc-11e6-99d9-806e6f6e6963}\`)func setVolumeMount(letter, volumeName string) error { path := C.CString(letter) defer C.free(unsafe.Pointer(path)) v := C.CString(volumeName) defer C.free(unsafe.Pointer(v)) _, _, err := setVolumeMountPoint.Call(uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(v))) if err.Error() != success { return err } return nil}//delVolumeMount("D:\\")func delVolumeMount(letter string) error { p := C.CString(letter) defer C.free(unsafe.Pointer(p)) _, _, err := deleteVolumeMountPoint.Call(uintptr(unsafe.Pointer(p))) if err.Error() != success { return err } return nil}func usage() { println(os.Args[0] + ` usage: 删除一个盘符:` + os.Args[0] + " -d E" + ` 修改一个盘符:` + os.Args[0] + " D E") os.Exit(1)}
1 0
- Go1.8操作Windows硬盘小实例
- Go1.9windows创建服务小实例
- Go1.9接入prometheus监控小实例
- Go1.10在编译成dll小实例
- Go1.9组播发送消息小实例
- golang语言错误: object is [windows amd64 go1.8 X:framepointer] expected [windows amd64 go1.9 X:framepoin
- Ubuntu安装go1.8
- Go1.5从文件读取密码,然后到远端下载文件的小实例.(通过sftp协议下载)
- Go1.9 tcpproxy代理小实现
- go1.5 64位下载 windows
- Go1.8抓取网络数据包
- Ubuntu下go1.8安装
- Golang1.8获取Windows硬件信息小实例.
- Go1.7.3一个收发消息的小接口
- 安装go最新版本go1.8
- Go1.8从文件结尾读取文件
- [ahk]操作Windows计算器实例
- ABAP Windows Excel实例操作
- Activity加载view6.0源码分析---setContentView
- Vue2+VueRouter2+webpack 构建项目实战(一)准备工作
- js 文件 使用c标签
- ThreadPoolExecutor线程池的创建和参数详解
- PHP加密解密
- Go1.8操作Windows硬盘小实例
- JAVA学习路线图
- Scroller类的介绍
- 快速排序的C++实现代码
- 位运算基本操作总结
- 使用dubbo时applicationContext.xml报错解决办法
- DOM节点删除之detach()和remove()区别
- Mahalanobis距离
- CocoaPods创建公有和私有Pod库方法总结