C#调用系统的复制、移动、删除【推荐】

之前发表了一个调用系统的复制移动删除的文章,经过多次测试发现了一点问题,同一时间只能执行一个文件的复制

        public class Win32
        {
            public enum FileFuncFlags : uint
            {
                FO_MOVE = 0x1,
                FO_COPY = 0x2,
                FO_DELETE = 0x3,
                FO_RENAME = 0x4
            }
            [Flags]
            public enum FILEOP_FLAGS : ushort
            {
                FOF_MULTIDESTFILES = 0x1,
                FOF_CONFIRMMOUSE = 0x2,
                FOF_SILENT = 0x4,
                FOF_RENAMEONCOLLISION = 0x8,
                FOF_NOCONFIRMATION = 0x10,
                FOF_WANTMAPPINGHANDLE = 0x20,
                FOF_ALLOWUNDO = 0x40,
                FOF_FILESONLY = 0x80,
                FOF_SIMPLEPROGRESS = 0x100,
                FOF_NOCONFIRMMKDIR = 0x200,
                FOF_NOERRORUI = 0x400,
                FOF_NOCOPYSECURITYATTRIBS = 0x800,
                FOF_NORECURSION = 0x1000,
                FOF_NO_CONNECTED_ELEMENTS = 0x2000,
                FOF_WANTNUKEWARNING = 0x4000,
                FOF_NORECURSEREPARSE = 0x8000
            }

            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
            public struct SHFILEOPSTRUCT
            {
                public IntPtr hwnd;
                public FileFuncFlags wFunc;
                [MarshalAs(UnmanagedType.LPWStr)]
                public string pFrom;
                [MarshalAs(UnmanagedType.LPWStr)]
                public string pTo;
                public FILEOP_FLAGS fFlags;
                [MarshalAs(UnmanagedType.Bool)]
                public bool fAnyOperationsAborted;
                public IntPtr hNameMappings;
                [MarshalAs(UnmanagedType.LPWStr)]
                public string lpszProgressTitle;
            }
            [DllImport("shell32.dll", CharSet = CharSet.Unicode)]
            public static extern int SHFileOperation([In] ref SHFILEOPSTRUCT lpFileOp);
        }
        /// <summary>
        /// 复制
        /// </summary>
        /// <param name="SourceFileName">文件源</param>
        /// <param name="DestFileName">目标路径</param>
        /// <returns>是否成功复制</returns>
        private bool Win32CopyFile(string SourceFileName, string DestFileName)
        {
            Win32.SHFILEOPSTRUCT op = new Win32.SHFILEOPSTRUCT();
            op.hwnd = IntPtr.Zero;
            op.wFunc = Win32.FileFuncFlags.FO_COPY;
            op.pFrom = SourceFileName + "\0";// 需要注意,最后需要加入"\0"表示字符串结束,如果需要拷贝多个文件,则 file1 + "\0" + file2 + "\0"...
            op.pTo = DestFileName + "\0";// 需要注意,最后需要加入"\0"表示字符串结束
            op.hNameMappings = IntPtr.Zero;
            op.fFlags = Win32.FILEOP_FLAGS.FOF_NOCONFIRMMKDIR;
            op.fAnyOperationsAborted = false;
            int ret = Win32.SHFileOperation(ref op);
            return ret == 0;
        }
原文地址:https://www.cnblogs.com/qq1223558/p/3120619.html