Go语言如何把文件放到回收站-(window系统)

文章讲述了在Go语言中,如何通过syscall模块调用WindowsAPI来实现将文件移动到回收站,而不是直接删除。作者遇到问题后,通过研究和尝试,定义了SHFILEOPSTRUCT结构体并调用了SHFileOperation函数,实现了FO_DELETE功能,同时设置了FOF_ALLOWUNDO标志以允许撤销操作。
摘要由CSDN通过智能技术生成
说明:因为最近接到一个小需求,把文件放到回收站,当时第一反应是这有什么难的?
结果用go的os.remove 把文件删除掉,惊奇的发现回收站并没有删除的文件,为此翻了很多论坛也没有找到答案。最终花了小半天,需要通过syscall修改文件的属性。以下是代码

// 定义 SHFILEOPSTRUCT 结构体
type SHFILEOPSTRUCT struct {
   hwnd   uintptr
   wFunc  uint32
   pFrom  *uint16
   pTo    *uint16
   fFlags uint32
}

// 定义 SHFileOperation 函数
var shell32 = syscall.NewLazyDLL("shell32.dll")
var procSHFileOperation = shell32.NewProc("SHFileOperationW")

func SHFileOperation(op *SHFILEOPSTRUCT) int {
   rc, _, _ := procSHFileOperation.Call(uintptr(unsafe.Pointer(op)))
   return int(rc)
}

// 定义一些常量
const (
   FO_DELETE          = 3
   FOF_ALLOWUNDO      = 0x0040
   FOF_NOCONFIRMATION = 0x0010
)
// 删除文件到回收站,适用于windows系统的函数
func DeleteToBin(s string) bool {

   // 构造 SHFILEOPSTRUCT 结构体
   op := &SHFILEOPSTRUCT{
      hwnd:   0,
      wFunc:  FO_DELETE,
      pFrom:  syscall.StringToUTF16Ptr(s), // 注意要以两个 \0 结尾
      pTo:    nil,
      fFlags: FOF_ALLOWUNDO | FOF_NOCONFIRMATION, // 使用 FOF_ALLOWUNDO 可以将文件移动到回收站
   }

   // 调用 SHFileOperation 函数
   ret := SHFileOperation(op)
   if ret != 0 {
      // 删除失败,输出错误信息
      err := syscall.Errno(ret)
      println("Error deleting file:", err)
   } else {
      // 删除成功
      println("File deleted successfully.")
      return true
   }
   return false
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值