Code archives/File Utilities/Delete to Recycle Bin

This code has been declared by its author to be Public Domain code.

Download source code

Delete to Recycle Bin by JoshK2012
Set the optional permanent argument to True to perform a conventional file deletion. Windows only, at the moment.
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.

Code Archives Forum