• 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;
            }
  • 相关阅读:
    [开源] FreeSql.AdminLTE 功能升级
    [开源] .NETCore websocket 即时通讯组件---ImCore
    [开源] FreeSql 配套工具,基于 Razor 模板实现最高兼容的生成器
    Redis 基础数据结构
    Keepalived 原理与实战
    反向代理与负载均衡
    Nginx 安装与配置
    CentOS 7.x编写开机启动服务
    Mac 软件包管理器Homebrew使用指北
    Springboot 关于日期时间格式化处理方式总结
  • 原文地址:https://www.cnblogs.com/qq1223558/p/3120619.html
Copyright © 2020-2023  润新知