tags:

views:

854

answers:

4

Programmatic solution of course...

Man i wish i could choose both the VB and Unmanaged as an answer ;)

Thanks for both.

+7  A: 

You need to delve into unmanaged code. Here's a static class that I've been using:

public static class Recycle
{
    private const int FO_DELETE = 3;
    private const int FOF_ALLOWUNDO = 0x40;
    private const int FOF_NOCONFIRMATION = 0x0010;

    [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)]
    static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp);

    public static void DeleteFileOperation(string filePath)
    {
        SHFILEOPSTRUCT fileop = new SHFILEOPSTRUCT();
        fileop.wFunc = FO_DELETE;
        fileop.pFrom = filePath + '\0' + '\0';
        fileop.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION;

        SHFileOperation(ref fileop);
    }
}

Addendum:

  • Tsk tsk @ Jeff for "using Microsoft.VisualBasic" in C# code.
  • Tsk tsk @ MS for putting all the goodies in VisualBasic namespace.
Ishmaeel
I guess this is one of the areas where VB is just better than C#...besides, it's not "not C#" just because it's in the VB namespace - an object is an object, not to use it just because it's in a namespace you don't like the name of is a little ridiculous don't you think?...
BenAlabaster
...if the namespace was Microsoft.UsefulUtilities you wouldn't have an reservations about using them, so what's the difference?
BenAlabaster
+12  A: 

http://www.daveamenta.com/2008-05/c-delete-a-file-to-the-recycle-bin/

From above:

using Microsoft.VisualBasic;

string path = @"c:\myfile.txt";
FileIO.FileSystem.DeleteDirectory(path, 
    FileIO.UIOption.OnlyErrorDialogs, 
    RecycleOption.SendToRecycleBin);
TK
I'd use DeleteFile instead of DeleteDirectory to be more clear.
Scott Bilas
+1 for thinking outside the box and referencing a disliked namespace rather than resorting to ugly unmanaged code.
BenAlabaster
+7  A: 

The best way I have found is to use the VB function FileSystem.DeleteFile.

Microsoft.VisualBasic.FileIO.FileSystem.DeleteFile(file.FullName,
    Microsoft.VisualBasic.FileIO.UIOption.OnlyErrorDialogs,
    Microsoft.VisualBasic.FileIO.RecycleOption.SendToRecycleBin);

It requires adding Microsoft.VisualBasic as a reference, but this is part of the .NET framework and so isn't an extra dependency.

Alternate solutions require a P/Invoke to SHFileOperation, as well as defining all the various structures/constants. Including Microsoft.VisualBasic is much neater by comparison.

Zooba
+7  A: 

@Ishmaeel: you consider it worse to use the Microsoft.VisualBasic namespace (that as @Zoomba suggested is a standard library anyway) than using P/Invoke to unmanaged code?

I know (some) C# guys don't like VB, but that is a little obsessive?

KiwiBastard