Send a File to the Recycle Bin

后端 未结 8 914
北海茫月
北海茫月 2020-11-27 10:59

Currently I\'m using the following function

file.Delete();

But how can I use this function to send a file to the recycle bin instead of jus

相关标签:
8条回答
  • 2020-11-27 11:25

    You can DllImport SHFileOperation to do this.

    0 讨论(0)
  • 2020-11-27 11:27

    Unfortunately you need to resort to the Win32 API to remove a file to the Recycle Bin. Try the following code, based on this post. It makes use of the generic SHFileOperation function for file system operations via the Windows Shell.

    Define the following (in a utilities class is probably best).

    [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; // Don't prompt the user
    

    And to use it to delete a file, sending it to the Recycle Bin, you want something like:

    var shf = new SHFILEOPSTRUCT();
    shf.wFunc = FO_DELETE;
    shf.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION;
    shf.pFrom = @"C:\test.txt";
    SHFileOperation(ref shf);
    
    0 讨论(0)
  • 2020-11-27 11:29

    From MSDN:

    Add a reference to Microsoft.VisualBasic assembly. The needed class is found in this library.

    Add this using statement to the top of the file using Microsoft.VisualBasic.FileIO;

    Use FileSystem.DeleteFile to delete a file, it has the option to specify recycle bin or not.

    Use FileSystem.DeleteDirectory to delete a directory with the option to specify to send it to the recycle bin or not.

    0 讨论(0)
  • 2020-11-27 11:31

    NOTE: This also does not work with non UI Interactive apps like Windows Services

    This wrapper can provide you needed functionality:

    using System.Runtime.InteropServices;
    
    public class FileOperationAPIWrapper
        {
            /// <summary>
            /// Possible flags for the SHFileOperation method.
            /// </summary>
            [Flags]
            public enum FileOperationFlags : ushort
            {
                /// <summary>
                /// Do not show a dialog during the process
                /// </summary>
                FOF_SILENT = 0x0004,
                /// <summary>
                /// Do not ask the user to confirm selection
                /// </summary>
                FOF_NOCONFIRMATION = 0x0010,
                /// <summary>
                /// Delete the file to the recycle bin.  (Required flag to send a file to the bin
                /// </summary>
                FOF_ALLOWUNDO = 0x0040,
                /// <summary>
                /// Do not show the names of the files or folders that are being recycled.
                /// </summary>
                FOF_SIMPLEPROGRESS = 0x0100,
                /// <summary>
                /// Surpress errors, if any occur during the process.
                /// </summary>
                FOF_NOERRORUI = 0x0400,
                /// <summary>
                /// Warn if files are too big to fit in the recycle bin and will need
                /// to be deleted completely.
                /// </summary>
                FOF_WANTNUKEWARNING = 0x4000,
            }
    
            /// <summary>
            /// File Operation Function Type for SHFileOperation
            /// </summary>
            public enum FileOperationType : uint
            {
                /// <summary>
                /// Move the objects
                /// </summary>
                FO_MOVE = 0x0001,
                /// <summary>
                /// Copy the objects
                /// </summary>
                FO_COPY = 0x0002,
                /// <summary>
                /// Delete (or recycle) the objects
                /// </summary>
                FO_DELETE = 0x0003,
                /// <summary>
                /// Rename the object(s)
                /// </summary>
                FO_RENAME = 0x0004,
            }
    
    
    
            /// <summary>
            /// SHFILEOPSTRUCT for SHFileOperation from COM
            /// </summary>
            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
            private struct SHFILEOPSTRUCT
            {
    
                public IntPtr hwnd;
                [MarshalAs(UnmanagedType.U4)]
                public FileOperationType wFunc;
                public string pFrom;
                public string pTo;
                public FileOperationFlags fFlags;
                [MarshalAs(UnmanagedType.Bool)]
                public bool fAnyOperationsAborted;
                public IntPtr hNameMappings;
                public string lpszProgressTitle;
            }
    
            [DllImport("shell32.dll", CharSet = CharSet.Auto)]
            private static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp);
    
            /// <summary>
            /// Send file to recycle bin
            /// </summary>
            /// <param name="path">Location of directory or file to recycle</param>
            /// <param name="flags">FileOperationFlags to add in addition to FOF_ALLOWUNDO</param>
            public static bool Send(string path, FileOperationFlags flags)
            {
                try
                {
                    var fs = new SHFILEOPSTRUCT
                                            {
                                                wFunc = FileOperationType.FO_DELETE,
                                                pFrom = path + '\0' + '\0',
                                                fFlags = FileOperationFlags.FOF_ALLOWUNDO | flags
                                            };
                    SHFileOperation(ref fs);
                    return true;
                }
                catch (Exception)
                {
                    return false;
                }
            }
    
            /// <summary>
            /// Send file to recycle bin.  Display dialog, display warning if files are too big to fit (FOF_WANTNUKEWARNING)
            /// </summary>
            /// <param name="path">Location of directory or file to recycle</param>
            public static bool Send(string path)
            {
                return Send(path, FileOperationFlags.FOF_NOCONFIRMATION | FileOperationFlags.FOF_WANTNUKEWARNING);
            }
    
            /// <summary>
            /// Send file silently to recycle bin.  Surpress dialog, surpress errors, delete if too large.
            /// </summary>
            /// <param name="path">Location of directory or file to recycle</param>
            public static bool MoveToRecycleBin(string path)
            {
                return Send(path, FileOperationFlags.FOF_NOCONFIRMATION | FileOperationFlags.FOF_NOERRORUI | FileOperationFlags.FOF_SILENT);
    
            }
    
            private static bool deleteFile(string path, FileOperationFlags flags)
            {
                try
                {
                    var fs = new SHFILEOPSTRUCT
                                            {
                                                wFunc = FileOperationType.FO_DELETE,
                                                pFrom = path + '\0' + '\0',
                                                fFlags = flags
                                            };
                    SHFileOperation(ref fs);
                    return true;
                }
                catch (Exception)
                {
                    return false;
                }
            }
    
            public static bool DeleteCompletelySilent(string path)
            {
                return deleteFile(path,
                                  FileOperationFlags.FOF_NOCONFIRMATION | FileOperationFlags.FOF_NOERRORUI |
                                  FileOperationFlags.FOF_SILENT);
            }
        }
    
    0 讨论(0)
  • 2020-11-27 11:31

    There is built-in library for this .

    First add reference Microsoft.VisualBasic Then add this code :

    FileSystem.DeleteFile(path_of_the_file,
                            Microsoft.VisualBasic.FileIO.UIOption.AllDialogs,
                            Microsoft.VisualBasic.FileIO.RecycleOption.SendToRecycleBin,
                            Microsoft.VisualBasic.FileIO.UICancelOption.ThrowException);
    

    I have found this here .

    0 讨论(0)
  • 2020-11-27 11:34

    Use FileSystem.DeleteFile and specify the right RecycleOption.

    While this will work with UI Interactive Apps, it will not work with non UI interactive apps like a Windows Service app.

    0 讨论(0)
提交回复
热议问题