Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

How to Delete a File or Folder to Recyclebin

0.00/5 (No votes)
20 Sep 2012 1  
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);

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here