C# 调用系统级方法复制、移动和删除等操作界面

news2024/11/27 23:10:46

有时候需要在程序复制、移动、删除文件等操作,虽然实现的方法有很多,但有些时候真的不如系统自带的界面效果来的直接省事。

好了不啰嗦了,直接看代码。这是网上找的,能用,但是有一点bug,有时候第一次复制文件会弹出目标文件夹不存在,给我整蒙了。还是贴上来,后面有我在用的封装好的类。

这是网上找的,慎用,请调试好了再上线。

    public partial class Form1 : Form  
    {  
        [DllImport("shell32.dll", SetLastError = true, CharSet = CharSet.Unicode)]  
        private static extern bool  SHFileOperation([In, Out]  SHFILEOPSTRUCT str);  
        private const int FO_MOVE = 0x1;  
        private const int FO_COPY = 0x2;  
        private const int FO_DELETE = 0x3;  
        private const ushort FOF_NOCONFIRMATION = 0x10;  
        private const ushort FOF_ALLOWUNDO = 0x40;  
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]  
        public class SHFILEOPSTRUCT  
        {  
            public IntPtr hwnd;  
            /// <summary>  
            /// 设置操作方式,移动:FO_MOVE,复制:FO_COPY,删除:FO_DELETE  
            /// </summary>  
            public UInt32 wFunc;  
            /// <summary>  
            /// 源文件路径  
            /// </summary>  
            public string pFrom;  
            /// <summary>  
            /// 目标文件路径  
            /// </summary>  
            public string pTo;  
            /// <summary>  
            /// 允许恢复  
            /// </summary>  
            public UInt16 fFlags;  
            /// <summary>  
            /// 监测有无中止  
            /// </summary>  
            public Int32 fAnyOperationsAborted;  
            public IntPtr hNameMappings;  
            /// <summary>  
            /// 设置标题  
            /// </summary>  
            public string lpszProgressTitle;  
        }  
        public Form1()  
        {  
            InitializeComponent();  
        }  
   
        private void button1_Click(object sender, EventArgs e)  
        {  
            MessageBox.Show(CopyFile().ToString());  
        }  
        private bool CopyFile()  
        {  
            SHFILEOPSTRUCT pm = new SHFILEOPSTRUCT();  
            pm.wFunc = FO_COPY;  
            pm.pFrom = @"F:/Office2003sp2_xunchi.exe";  
            pm.pTo = @"c:/a.exe";  
            pm.fFlags = FOF_ALLOWUNDO;//允许恢复  
            pm.lpszProgressTitle = "哈哈";  
            return !SHFileOperation(pm);  
   
        }  
    } 

下面是我在用的。FileOperationManager.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using static Nonoby.FormMain;

namespace Nonoby.Helpers
{
    public static class FileOperationManager
    {
        [DllImport("shell32.dll")]
        private static extern int SHFileOperation(ref SHFILEOPSTRUCT lpFileOp);
        private struct SHFILEOPSTRUCT
        {
            public IntPtr hwnd;
            public WFUNC wFunc;
            public string pFrom;
            public string pTo;
            public FILEOP_FLAGS fFlags;
            public bool fAnyOperationsAborted;
            public IntPtr hNameMappings;
            public string lpszProgressTitle;
        }
        private enum WFUNC
        {
            FO_MOVE = 0x0001,
            FO_COPY = 0x0002,
            FO_DELETE = 0x0003,
            FO_RENAME = 0x0004
        }
        private enum FILEOP_FLAGS
        {
            FOF_MULTIDESTFILES = 0x0001, //pTo 指定了多个目标文件,而不是单个目录
            FOF_CONFIRMMOUSE = 0x0002,
            FOF_SILENT = 0x0044, // 不显示一个进度对话框
            FOF_RENAMEONCOLLISION = 0x0008, // 碰到有抵触的名字时,自动分配前缀
            FOF_NOCONFIRMATION = 0x10, // 不对用户显示提示
            FOF_WANTMAPPINGHANDLE = 0x0020, // 填充 hNameMappings 字段,必须使用 SHFreeNameMappings 释放
            FOF_ALLOWUNDO = 0x40, // 允许撤销
            FOF_FILESONLY = 0x0080, // 使用 *.* 时, 只对文件操作
            FOF_SIMPLEPROGRESS = 0x0100, // 简单进度条,意味者不显示文件名。
            FOF_NOCONFIRMMKDIR = 0x0200, // 建新目录时不需要用户确定
            FOF_NOERRORUI = 0x0400, // 不显示出错用户界面
            FOF_NOCOPYSECURITYATTRIBS = 0x0800, // 不复制 NT 文件的安全属性
            FOF_NORECURSION = 0x1000 // 不递归目录
        }

        public static bool Copy(string path, string dest, out string msg)
        {
            return Operation(WFUNC.FO_COPY, path, dest, out msg);
        }

        public static bool MoveTo(string path, string dest, out string msg)
        {
            return Operation(WFUNC.FO_MOVE, path, dest, out msg);
        }

        public static bool Delete(string path, out string msg)
        {
            return Operation(WFUNC.FO_DELETE, path, null, out msg);
        }

        public static bool Rename(string path, string dest, out string msg)
        {
            return Operation(WFUNC.FO_RENAME, path, dest, out msg);
        }

        private static bool Operation(WFUNC func, string path, string dest, out string msg)
        {
            SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT
            {
                wFunc = func,
                pFrom = path + "\0",
                fFlags = FILEOP_FLAGS.FOF_ALLOWUNDO,
                fAnyOperationsAborted = false,
            };
            if (!string.IsNullOrEmpty(dest))
            {
                lpFileOp.pTo = dest + "\0";
            }
            int state = SHFileOperation(ref lpFileOp);
            msg = GetAbortedString(state);
            return state == 0;
        }

        private static string GetAbortedString(int code)
        {
            if (code == 0)
            {
                return "【操作完成】";
            }
            string state = code.ToString("X").ToUpper();
            switch (state)
            {
                case "4C7":
                    return "【您已取消操作】";
                //case "74":
                //    return "The source is a root directory, which cannot be moved or renamed.";
                //case "76":
                //    return "Security settings denied access to the source.";
                case "7C":
                return "【路径错误】您操作路径的源或目标对象没有找到";
                //case "10000":
                //    return "An unspecified error occurred on the destination.";
                //case "402":
                //    return "An unknown error occurred. This is typically due to an invalid path " + "in the source or destination. This error does not occur on Windows Vista and later.";
                default:
                    return state;
            }
        }
    }
}
bool isSuccess = FileOperationManager.Copy(@"C:\1.txt", @"D:\2.txt", out string msg);

//isSuccess == True 成功
//msg 操作结果提示,自己继续完善下
MessageBox.Show(msg);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2248677.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI赋能电商:打造高效销售与卓越用户体验的新引擎

在数字经济迅猛发展的今天&#xff0c;电商行业正处于持续演变的关键时期。技术的进步不仅重塑了电商生态的运行方式&#xff0c;也在深刻改变用户的消费习惯。人工智能&#xff08;AI&#xff09;作为现代科技的核心驱动力&#xff0c;为电商平台提供了前所未有的工具和机遇。…

基于机器视觉的表面缺陷检测

基于机器视觉的表面缺陷检测存在的问题与难点 - AVT相机|AVT红外相机|万兆网相机EVT|VIEWORKS线扫相|映美精相机|Specim多光谱相机|Adimec相机|Basler相机|富士能FUJINON镜头|理光RICOH镜头|OPTO远心镜头|SPO远心镜头|Navtar镜头|VST镜头|CCS光源|3D视觉引导机床上下料系统 (完…

Fakelocation Server服务器/专业版 Windows11

前言:需要Windows11系统 Fakelocation开源文件系统需求 Windows11 | Fakelocation | 任务一 打开 PowerShell&#xff08;以管理员身份&#xff09;命令安装 Chocolatey Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProto…

【Android】View的解析—滑动篇

1.View与ViewGroup View&#xff1a; View是Android中所有UI组件的基类&#xff0c;提供了绘制&#xff08;draw&#xff09;、布局&#xff08;layout&#xff09;和事件处理&#xff08;event handling&#xff09;的基础功能。它是一个抽象类&#xff0c;不能直接实例化&…

极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【三】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

基于混合ABC和A*算法复现

基于混合ABC和A*算法复现 一、背景介绍二、算法原理&#xff08;一&#xff09;A*算法原理&#xff08;二&#xff09;人工蜂群算法原理&#xff08;三&#xff09;混合ABC和A*算法策略 三、代码实现&#xff08;一&#xff09;数据准备&#xff08;二&#xff09;关键函数实现…

linux运行vue编译后的项目

如果你的 Vue 项目使用了 history 模式&#xff08;而非默认的 hash 模式&#xff09;&#xff0c;在纯静态服务器中会出现类似的问题。因为 Vue Router 的 history 模式要求所有未匹配的路径都重定向到 index.html&#xff0c;以便 Vue 前端处理路径。 首先在本地执行npm run…

模拟实现Bash

模拟实现Bash 1.Bash基本认识2.Bash实现3.添加细节4.内置命令5.完整代码 &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列专栏&#xff1a;【Linux的学习】 &#x1f4dd;&#x1f4dd;本篇内容…

sql注入报错分享(mssql+mysql)

mysql mysql的报错内容比较多 网上也有比较多的 这里重复的就不多介绍了。一笔带过 溢出类 bigint 当超过mysql的整形的时候&#xff0c;就会导致溢出&#xff0c;mysql可能会将错误信息带出。这里user()是字母默认为0 取反以后1可能就会导致异常。 报错特征 BIGINT UNSIG…

Hadoop3.3.6集群安装

Hadoop3.3.6 三节点集群安装 准备工作 准备三台机器&#xff0c;大小为4c8g&#xff0c;主节点为 8c16g。并需要保证网络连通性&#xff0c;每台机器都相互ping一下 1、关闭网络防火墙 # 查看网络防火墙状态 sudo systemctl status firewalld # 立即停止 firewalld sudo sy…

如何制作项目网页

一、背景 许多论文里经常会有这样一句话Supplementary material can be found at https://hri-eu.github.io/Lami/&#xff0c;这个就是将论文中的内容或者补充视频放到一个网页上&#xff0c;以更好的展示他们的工作。因此&#xff0c;这里介绍下如何使用前人提供的模板制作我…

JVM调优篇之JVM基础入门AND字节码文件解读

目录 Java程序编译class文件内容常量池附录-访问标识表附录-常量池类型列表 Java程序编译 Java文件通过编译成class文件后&#xff0c;通过JVM虚拟机解释字节码文件转为操作系统执行的二进制码运行。 规范 Java虚拟机有自己的一套规范&#xff0c;遵循这套规范&#xff0c;任…

已存大量数据的mysql库实现主从各种报错----解决方案(看评论)

背景何谓“先死后生”本文使用技术1、实施流程图2、实施2.1、数据库备份2.2、搭建Mysql的Master-Slave2.2.1、准备工作2.2.2、开始部署2.2.3、账号配置2.2.4、slave 同步配置2.2.5、验证 2.3、Master做数据恢复 结语 背景 计划对已有大量数据的mysql库的主从搭建&#xff0c;使…

数据结构 【双向哨兵位循环链表】

链表的结构分为8中&#xff0c;其实搞懂了单链表和双向哨兵位循环链表&#xff0c;这部分的知识也就掌握的差不多了。双向哨兵位循环链表的结构如下&#xff1a; 下面我从0构建一个双向哨兵位循环链表。 1、准备工作 构建节点结构体&#xff0c;双向循环链表的每一个…

高级AI记录笔记(五)

学习位置 B站位置&#xff1a;红豆丨泥 UE AI 教程原作者Youtube位置&#xff1a;https://youtu.be/-t3PbGRazKg?siRVoaBr4476k88gct素材自备 改良近战AI格挡行为 把近战AI的格挡行为从行为树中单独一个任务分块中给删除掉&#xff0c;因为我们希望敌人在受到伤害后立即进行…

彻底解决 macOS 下Matplotlib 中文显示乱码问题

彻底解决 macOS 下Matplotlib 中文显示乱码问题 在使用 Python 的 Matplotlib 库进行数据可视化时&#xff0c;中文字符的显示常常会出现乱码问题&#xff0c;尤其在 macOS 系统上。在网上找了一大堆方法&#xff0c;花了很久&#xff0c;发现不是要安装各种字体就是要改配置&…

11.25.2024刷华为OD

文章目录 HJ76 尼科彻斯定理&#xff08;观察题&#xff0c;不难&#xff09;HJ77 火车进站&#xff08;DFS&#xff09;HJ91 走格子方法&#xff0c;&#xff08;动态规划&#xff0c;递归&#xff0c;有代表性&#xff09;HJ93 数组分组&#xff08;递归&#xff09;语法知识…

突破性算法:让无人机集群在狭窄空间内穿针引线

导读 在建筑救援、森林搜索等任务中&#xff0c;无人机集群经常会遇到狭窄空间限制和动态障碍物变化等挑战。这些挑战会导致集群内部冲突&#xff0c;或在执行任务时因避让动态障碍物而导致系统混乱。实际应用场景和任务的严格特征往往使得全局搜索难以优化&#xff0c;而局部避…

Python中的简单爬虫

文章目录 一. 基于FastAPI之Web站点开发1. 基于FastAPI搭建Web服务器2. Web服务器和浏览器的通讯流程3. 浏览器访问Web服务器的通讯流程4. 加载图片资源代码 二. 基于Web请求的FastAPI通用配置1. 目前Web服务器存在问题2. 基于Web请求的FastAPI通用配置 三. Python爬虫介绍1. 什…

【Shell】运维快捷键及shell各种不同实际运维场景

一&#xff0c;控制台使用技巧 1&#xff0c;操作快捷键 Ctrlr :可以快速查找历史命令 Ctrll :可以清理控制台屏幕 Ctrla \ Ctrle :移动光标到命令行首\行尾 Ctrlw \ Ctrlk :删除光标之前\之后的内容 2&#xff0c;VIM文件编辑快捷键 快捷键ZZ :文件保存并退出 3&#xff…