[bmx] Delete to Recycle Bin by JoshK [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:43

Previous topic - Next topic

BlitzBot

Title : Delete to Recycle Bin
Author : JoshK
Posted : 1+ years ago

Description : Set the optional permanent argument to True to perform a conventional file deletion.  Windows only, at the moment.

Code :
Code (blitzmax) Select
SuperStrict

?win32
Import pub.win32

Type SHFILEOPSTRUCT
Field hwnd:Int
Field wFunc:Int
Field pFrom:Int
Field pTo:Byte Ptr
Field fFlags:Int
Field fAnyOperationsAborted:Int
Field hNameMappings:Int
Field lpszProgressTitle:Int
EndType

Extern "win32"
Function SHFileOperation:Int(lpFileOp:Byte Ptr)
EndExtern

Const DE_SAMEFILE     :Int = $71
Const DE_MANYSRC1DEST :Int = $72
Const DE_OPCANCELLED  :Int = $75
Const DE_DESTSUBTREE  :Int = $76
Const DE_INVALIDFILES :Int = $7C
Const DE_DESTSAMETREE :Int = $7D
Const DE_DIFFDIR       :Int = $73
Const DE_FILEDESTISFLD :Int = $80

Const FO_DELETE:Int = $3
Const FOF_ALLOWUNDO:Int = $40
Const FOF_NOCONFIRMATION:Int = $10
Const FOF_SILENT:Int = $4
?

Function DeleteDir:Int(filename:String,recursive:Int=False,permanent:Int=False)
Local dir:String[]
Local file:String

If permanent Return BRL.FileSystem.DeleteDir(filename,recursive)
If FileType(filename)<>2 Return False
If Not recursive
dir=LoadDir(filename)
If dir.length Return False
EndIf
Return DeleteFile(filename)
EndFunction

Function DeleteFile:Int(filename:String,permanent:Int=False)
?macos
Return BRL.FileSystem.DeleteFile(filename)
?
?linux
Return BRL.FileSystem.DeleteFile(filename)
?
?win32
'CallWindowProc function
'http://msdn.microsoft.com/en-us/library/windows/Desktop/ms633571%28v=vs.85%29.aspx

'SHFileOperation function
'http://msdn.microsoft.com/en-us/library/windows/Desktop/bb762164%28v=vs.85%29.aspx

'SHFILEOPSTRUCT structure
'http://msdn.microsoft.com/en-us/library/windows/desktop/bb759795%28v=vs.85%29.aspx

Local lpFileOp:SHFILEOPSTRUCT=New SHFILEOPSTRUCT
Local sfrom:Short[]
Local sto:Short[]
Local n:Int
Local str_addr:Int
Local asm:Byte[5]
Local result:Int
Local doublenulltermstring:Byte[]

If permanent Return BRL.FileSystem.DeleteFile(filename)

filename=RealPath(filename).Replace("","/")

'We have to get some funny unicode string
asm[0]=$8b
asm[1]=$44
asm[2]=$24
asm[3]=$10
asm[4]=$c3

doublenulltermstring=doublenulltermstring[..filename.length+2]
For n=0 To filename.length-1
doublenulltermstring[n] = filename[n]
Next
doublenulltermstring[doublenulltermstring.length-2]=0
doublenulltermstring[doublenulltermstring.length-1]=0
str_addr = CallWindowProcA(asm,0,0,0,Int(Varptr doublenulltermstring[0]))

lpFileOp.wFunc=FO_DELETE
lpFileOp.pFrom=str_addr
lpFileOp.fFlags=FOF_ALLOWUNDO|FOF_SILENT|FOF_NOCONFIRMATION

result=SHFileOperation(lpFileOp)
If result=0 Return True Else Return False
?
EndFunction

Local path:String = "test.txt"

If DeleteFile(path)
Print "sent "+path+" to Bin"
Else
Print "problem sending file "+path+" to bin"
EndIf


Comments : none...