Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Forums > Глюкодром > C# + Удалить файло в корзину


Автор: Lexus - 21-08-2009, 14:37
Появилось надобность двигать файло в корзину.
До Vistы использовалось SHFileOperation в таком классе:
CODE
public class RecybleBin
    {

        /// <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, Pack = 1)]
        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
            {

                SHFILEOPSTRUCT fs = new SHFILEOPSTRUCT();
                fs.wFunc = FileOperationType.FO_DELETE;

                // important to double-terminate the string.
                fs.pFrom = path + '\0';// +'\0';
                fs.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 SendSilent(string path)
        {
            return Send(path, FileOperationFlags.FOF_NOCONFIRMATION | FileOperationFlags.FOF_NOERRORUI | FileOperationFlags.FOF_SILENT);

        }
    }
И потом по средствам RecycleBin.Send(путь к файлу) всё двигалось в корзину.
В Висте и Вин7 это уже не прокатывает. Т.е. никаких ошибок не выдаётся, просто не удаляется. Гуглс казал, что якобы надо использовать продвинутую версию IFileOperation. Но примеров использования я не нашёл, а сам ума дать не смог, как прикрутить.


Автор: Set - 21-08-2009, 20:33
http://msdn.microsoft.com/ru-ru/library/ms127977.aspx (http://msdn.microsoft.com/ru-ru/library/ms127977.aspx ?

Автор: Lexus - 21-08-2009, 21:15
Как я понял оно требует библу от VB, так как указание namespace:
Microsoft.VisualBasic.FileIO
не проканывает, студия говорит нема FileIO

Автор: Lord KiRon - 21-08-2009, 22:22
Добавь референс на Microsoft.VisualBasic.dll а вообще думаю что оно должно быть и по другому.

Автор: Lord KiRon - 21-08-2009, 22:25
Например можно попробовать мувнуть его в фолдер возвращаемый SHGetFolderLocation с параметром CSIDL_BITBUCKET .

Автор: Lexus - 22-08-2009, 16:43
Фокус не удался, так как Recycle Bin Виртуальная дира и SHGetFolderLocation возврашает нуль.

Автор: Lexus - 22-08-2009, 17:34
Кажется через Basic пошло, но как-то не особо красивый путь :&#040; НО раз идёт - пусть будет :&#041;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)