Files
varia-go/shared/trashcan.go
2025-10-27 22:51:42 +01:00

52 lines
1.2 KiB
Go

package shared
import (
"fmt"
"syscall"
"unsafe"
)
// Constants for the SHFileOperation function
const (
FO_DELETE = 3
FOF_ALLOWUNDO = 0x0040 // Move to Recycle Bin instead of permanently deleting
FOF_NOCONFIRMATION = 0x0010 // No confirmation dialogs
)
// SHFILEOPSTRUCT structure (Windows API)
type SHFILEOPSTRUCT struct {
Hwnd uintptr
WFunc uint32
PFrom *uint16
PTo *uint16
FFlags uint16
FAnyOperationsAborted bool
HNameMappings uintptr
LpszProgressTitle *uint16
}
// MoveToTrash moves a file or folder to the Windows Recycle Bin.
func MoveToTrash(path string) error {
// The string must be double null-terminated for the Windows API
from, err := syscall.UTF16FromString(path)
if err != nil {
return err
}
op := SHFILEOPSTRUCT{
WFunc: FO_DELETE,
PFrom: &from[0],
FFlags: FOF_ALLOWUNDO | FOF_NOCONFIRMATION,
}
shell32 := syscall.NewLazyDLL("shell32.dll")
shFileOperation := shell32.NewProc("SHFileOperationW")
ret, _, _ := shFileOperation.Call(uintptr(unsafe.Pointer(&op)))
if ret != 0 {
return fmt.Errorf("failed to move to trash: error code %d", ret)
}
return nil
}