65.9K
CodeProject is changing. Read more.
Home

How to Delete a File or Folder to Recyclebin

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (4 votes)

Sep 21, 2012

MIT
viewsIcon

28174

Delete a file or folder to Recyclebin using C#

Introduction

If we delete a file or folder using C# code, it will be deleted from the system permanently. Yesterday, I was searching for a solution, which would help me to delete a file to recycle bin. There is no direct API* available in .NET which could help me to achieve this. Later, I found an option using SHFileOperation function. SHFileOperation will be used to Copy, Move, Rename, or Delete a file system object. And here is the implementation which helped to delete file or folder to Recyclebin.

Using the Code

Given below is the implementation:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
public struct SHFILEOPSTRUCT
{
    public IntPtr hwnd;
    [MarshalAs(UnmanagedType.U4)]
    public int wFunc;
    public string pFrom;
    public string pTo;
    public short fFlags;
    [MarshalAs(UnmanagedType.Bool)]
    public bool fAnyOperationsAborted;
    public IntPtr hNameMappings;
    public string lpszProgressTitle;
}

[DllImport("shell32.dll", CharSet = CharSet.Auto)]
public static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp);

public const int FO_DELETE = 3;
public const int FOF_ALLOWUNDO = 0x40;
public const int FOF_NOCONFIRMATION = 0x10;

And you can use WIN32 API like this, in the code, we are creating an instance of SHFILEOPSTRUCT structure. wFunc is the value that indicates which operation to perform. The pFrom is a pointer to one or more source file names. These names should be fully qualified paths to prevent unexpected results. fFlags control the file operation.

var shf = new SHFILEOPSTRUCT();
shf.wFunc = FO_DELETE; //Delete the files specified in pFrom.
shf.fFlags = FOF_ALLOWUNDO; //Preserve undo information, if possible. 
shf.pFrom = @"c:\myfile.txt" + '\0' + '\0'; //File / Folder to delete
SHFileOperation(ref shf);

The pFrom parameter can be either file or folder. * This is not 100% true. We can do this by using Microsoft.VisualBasic namespace. And here is the implementation.

using Microsoft.VisualBasic; 

string path = @"c:\myfile.txt";
FileIO.FileSystem.DeleteDirectory(path, 
	FileIO.UIOption.OnlyErrorDialogs, 
	RecycleOption.SendToRecycleBin);