• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

C#如何调用Windows系统自身的文件复制功能,显示文件进度,显示重名提示 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

我们知道在.Net中要实现普通的文件复制功能很简单。File.Copy(src, dest)就可以完成。

如果需要显示复制文件的进度,如下图:

如果需要处理文件重名问题,如下图:

难道我们还需要自己编程一套逻辑和界面来完成以上功能吗?

这些问题Windows系统自身已经帮我们解决了,我们可以直接使用系统的文件复制功能来完成。

主要通过windows API:SHFileOperation 来实现

通过PInvoke转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);
}

调用步骤:

Win32.SHFILEOPSTRUCT op = new Win32.SHFILEOPSTRUCT();
op.hwnd = IntPtr.Zero;
op.wFunc = Win32.FileFuncFlags.FO_COPY;
op.pFrom = SrcTextBox.Text + "\0";// 需要注意,最后需要加入"\0"表示字符串结束,如果需要拷贝多个文件,则 file1 + "\0" + file2 + "\0"...
op.pTo = DestTextBox.Text + "\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;

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
深入.NET平台和C#编程.第七章:深入理解多态-上机练习2-3发布时间:2022-07-13
下一篇:
C++运算符优先级发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap