MFC Shell文件操作SHFileOperation

article/2025/9/19 18:12:03

外壳函数(Shell)--------SHFileOperation  
Copies, moves, renames, or deletes a file system object.文件复制、移动、重命名或者删除

int  SHFileOperation(
  __in  LPSHFILEOPSTRUCT lpFileOp
);

其参数lpFileOp是一个指向SHFILEOPSTRUCT结构的指针,该结构定义如下:

typedef  struct  _SHFILEOPSTRUCT {
  HWND         hwnd;                                      //显示文件操作时状态信息的对话框的窗口句柄
  UINT         wFunc;                                       //操作文件的方式,如复制、删除、重命名等
  LPCTSTR      pFrom;                                    //操作文件的源位置
  LPCTSTR      pTo;                                        //操作文件的目的位置
  FILEOP_FLAGS fFlags;                                //控制文件操作的标志
  BOOL          fAnyOperationsAborted;           //指示操作文件时是否有中断发生
  LPVOID       hNameMappings;                     //文件映射类句柄
  LPCTSTR      lpszProgressTitle;                    //带有进度条控件的文件信息对话框的标题
}  SHFILEOPSTRUCT,  * LPSHFILEOPSTRUCT;

注意,该结构中pFrom和pTo成员类型虽然是LPCTSTR,但是因为这个缓冲区内有时需要存放多个文件名,所以其中的每一个字符串都要以一个NULL结束,而整个字符串的结束是以连续的两个NULL。鉴于此,当直接将一个CString对象赋予这两个成员时,必须在末尾加上一个NULL,比如可以str.Insert(str.GetLength()+1,'/0')(这里的str为一个CString对象),否则将会出错。

以下代码摘自《精通MFC程序设计》第十四章,简单描写Shell文件操作步骤。
步骤一:添加成员变量

public :
    //定义外壳结构
    SHFILEOPSTRUCT fileOpStruct;
    //操作索引
    int  iIndex;

步骤二:消息响应

void  CShellOperation:: Onexecute()  
{
    // TODO: Add your control notification handler code here
    UpdateData( FALSE );
    DWORD  errorCode;
    //错误提示消息
    CString strMsg, strHint;
    CString strPre, strNxt;
    //源文件目的文件路径信息
    CString strTem1, strTem2;
    strTem1= m_sourcePath;
    strTem2= m_desPath;
    //由于fileOpStruct.pFrom的特殊要求,其必须以null结尾,否则不会成功
    //故这里需要在尾部加上null字符
    m_sourcePath.Insert( m_sourcePath.GetLength()+ 1 ,'/0' );
    m_desPath.Insert( m_desPath.GetLength()+ 1 ,'/0' );
    fileOpStruct.pFrom= m_sourcePath;
    fileOpStruct.pTo= m_desPath;
    int  k= m_desPath.GetLength();
    switch ( iIndex)
    {
        case  0 ://复制
            {
                //准备提示信息
                strPre= "将文件" ;
                strNxt= "中!" ;
                strPre= strPre+ strTem1+ "复制到" + strTem2+ strNxt;
                strHint= "复制被中断" ;
                strMsg= "复制出错,其代码为:" ;
                //填充结构的成员
                fileOpStruct.lpszProgressTitle= strPre;
                fileOpStruct.wFunc= FO_COPY;
                break ;
            }
        case  1 ://删除
            {
                //准备提示信息
                strPre= "将文件" ;
                strNxt= "删除!" ;
                strPre= strPre+ strTem1+ strNxt;
                strHint= "删除被中断" ;
                strMsg= "删除出错,其代码为:" ;
                //填充结构的成员
                fileOpStruct.lpszProgressTitle= strPre;
                fileOpStruct.wFunc= FO_DELETE;
                break ;
            }
        case  2 ://移动
            {
                //准备提示信息
                strPre= "将文件" ;
                strNxt= "中!" ;
                strPre= strPre+ strTem1+ "移动到" + strTem2+ strNxt;
                strHint= "移动被中断" ;
                strMsg= "移动出错,其代码为:" ;
                //填充结构的成员
                fileOpStruct.lpszProgressTitle= strPre;
                fileOpStruct.wFunc= FO_MOVE;
                break ;
            }
        default :
            break ;
    }

    //填充结构成员
    fileOpStruct.fFlags= FOF_SIMPLEPROGRESS;    
    int  res= SHFileOperation(& fileOpStruct);
    errorCode= GetLastError();
    if ( fileOpStruct.fAnyOperationsAborted== TRUE )
    {
        //提示中断信息
        AfxMessageBox( strHint);
    }
    else
    {
        //如果操作出错
        if ( res!= 0 )
        {
            CString strTem;
            strTem.Format( "%s%d" , strMsg, errorCode);
            AfxMessageBox( strMsg);
        }
    }
    //返回
    return ;
}

步骤三:初始化

BOOL  CShellOperation:: OnInitDialog()  
{
    CDialog:: OnInitDialog();   
    //初始化操作类别索引
    iIndex= 0 ;
    //其他初始化
    fileOpStruct.hwnd= GetSafeHwnd();
    return  TRUE ;   // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}

以上只是大概步骤,具体详细参见书本,或者参见代码。代码:http://download.csdn.net/source/2315687

相关资料:

1.http://msdn.microsoft.com/en-us/library/bb759795%28v=VS.85%29.aspx
2.http://hi.baidu.com/libinbluewolf/blog/item/60a5e235d76868b0d1a2d3b1.html
3.http://blog.sina.com.cn/s/blog_53cba9ad0100dcxi.html


http://chatgpt.dhexx.cn/article/DT6Xorbv.shtml

相关文章

hdfs Java API 删除文件

文章目录 hdfs Java API 删除文件一、创建目录二、判断文件是否存在三、判断path指向的是目录还是文件四、删除文件 hdfs Java API 删除文件 要删除目录之前,首先创建一个目录给我们删,在hdfs上创建一个/ied011目录 一、创建目录 下面是代码具体的步骤…

python 删除文件到回收站 SHFileOperation

python如果要删除一个文件,通常使用 os.remove(filename) 但是这样就直接从磁盘删除了。 有些文件需要删除到回收站 方法如下 : def del_file(filename):print(delete file, filename)# os.remove(filename) #直接删除文件,不经过回收站…

VB利用SHFileOperation实现拷贝、删除、重命名文件

Private Declare Function SHFileOperation Lib “shell32.dll” Alias “SHFileOperationA” (lpFileOp As SHFILEOPSTRUCT) As Long Private Type SHFILEOPSTRUCT hwnd As Long ’ wFunc As Long pFrom As String pTo As String fFlags As Integer fAnyOperationsAborted As …

Linux下rar文件的压缩与解压

Linux下rar文件的压缩与解压 工具:rar、unrar 链接:https://pan.baidu.com/s/1MP7XupLUtkf6JxLkRUH78g 密码:k431 一、上传到任意目录 二、解压 三、查看软件信息 四、创建软件系统路径 本次主要的是rar、unrar两个软件服务 五、服务搭建完成 此时,…

linux下解压rar和7z压缩文件

在windows下我们压缩解压文件通常后缀为rar,在linux下我们压缩解压文件通常后缀为tar 默认在linux下我们不能解压压缩rar文件 我们可以下载rarlinux安装包实现解压压缩后缀为rar的包 下载地址:WinRAR archiver, a powerful tool to process RAR and ZIP …

Linux【工具 01】rarlinux工具下载安装处理.rar格式文件实例

1.说明 要安装一个.rar格式的应用,上传 Linux 系统后发现没有解压工具,上网搜索后开始一波三折的旅程。 2.安装 2.1 跳坑 # 有小伙伴分享安装方法 yum install rar # 安装后根本无法使用 unrar 命令2.2 一波三折 WinRAR 官网下载 这里有各种操作系统…

linux系统下解压rar文件

1、下载linux版本的rar软件 访问官网 下载最新的、适用于自己的linux版本的rar软件。 可以在服务器终端通过命令getconf LONG_BIT查看自己的linux服务器的字长。我的是64位的,就下载图示箭头所指的版本 下载之后,传到服务器上,最好单独放在一…

Linux安装Rar软件与压缩、解压方法

在Win10上压缩的文件,一般以.rar结尾,这个压缩包如果要在Linux上解压,就需要用到Rar软件,下面介绍在Ubuntu v16.04 上安装Rar软件。 1 设置apt镜像源 设置apt镜像源,请参考这篇文章: https://blog.csdn.net/sanqima/…

Linux安装rar

安装rar 1、直接使用yum安装输入命令 wget --no-check-certificate http://www.rarsoft.com/rar/rarlinux-4.0.1.tar.gz 如果没有wget命令,需要先装一下 Yum -y install wget –no-check-certificate 这个是无视风险,这个网站好像出了点问题,…

html网页字体出现模糊,浏览器打开网页字体模糊问题的解决方法

前面脚本之家小编介绍了打开网页字体变大了怎么办的相关内容,如果你也遇到这种故障可以去前面找找脚本之家小编写的这篇教程。那么如果不是出现打开网页字体变大而是打开网页字体模糊怎么办?其实造成这种网页字体的故障首先是考虑到用户对浏览器设置错误…

html字体字号颜色怎么设置,HTML 字体颜色怎么设置?

HTML 字体颜色怎么设置? 在网页开发的过程中, 有时为了网页的美观, 需要给网页中的字体设置不同的颜色. 那么怎么设置字体颜色呢? 下面本篇文章就来给大家来介绍设置字体颜色的几种方法, 希望对大家有所帮助. 方法 1: 使用 < font > 标签的 color 属性设置字体颜色 col…

php怎么显示好看的字体颜色,网页中字体颜色设置方法的总结

那么我都知道网页中颜色的运用是网页必不可少的一个元素。使用颜色目的在于有区别、有动感、美观之用&#xff0c;同时颜色也是各种各样网页的样式表现元素之一,别急&#xff01;接下来详细为大家分别介绍通过html、CSS、JS/JQ进行字体颜色设置的方法。 字体颜色设置的相关总结…

css字体设置为白色,css怎么将字体设置成白色

css怎么将字体设置成白色 css将字体设置成白色的方法:可以通过使用color属性来指定字体的颜色,如【color: white】或【color: #fff】。color属性用于指定文本的颜色,颜色值可以是颜色名称或十六进制值。 环境: 本文适用于所有品牌的电脑。 (学习视频分享:css视频教程) 相关…

worder字体网页字体对照表

运营同学一直说设置的字体不对&#xff0c;在word上设置好的格式&#xff0c;复制到网站上之后&#xff0c;字体就变小了。 说这是个程序bug&#xff0c;发现怎么解释都解释不了了。 然后心理就有点不平衡&#xff0c;直接找到了字体对照表 字体对照表&#xff1a;大特号&…

html设置幼圆字体,CSS font-family中文字体设置方法

网站上的字体样式都是通过CSS来控制的&#xff0c;CSS font-family属性可以设置文字字体样式。 常用的网站字体设置代码如下&#xff1a; body{font-family:"Microsoft Yahei","Hiragino Sans GB","Helvetica Neue",Helvetica,tahoma,arial,Verd…

html5怎么设置字体位置,css如何设置字体位置

css设置字体位置的方法&#xff1a;1、使用【text-align】属性设置字体的位置&#xff1b;2、使用position属性设置字体位置&#xff1b;3、使用padding、margin属性设置字体位置。 本教程操作环境&#xff1a;windows10系统、css3版&#xff0c;DELL G3电脑&#xff0c;该方法…

php网页代码字体大小,html字体大小怎么设置

设置html字体大小的方法&#xff1a;1、【font-size】后面加px值的方式&#xff1b;2、使用inherit继承父元素的字体大小&#xff1b;3、设置固定的几个值&#xff1b;4、设置smaller和larger&#xff1b;5、设置百分比的形式。 本教程操作环境&#xff1a;windows10系统、html…

怎么调整网页页面大小在HTML中,网页字体大小设置方法 怎么改网页字体大小

经常有电脑爱好者朋友由于不小心误操作导致电脑浏览网页时出现了字体变大或变小等&#xff0c;导致使用不习惯。昨天刚好有电脑百事网网友又问到的网页字体大小设置的问题&#xff0c;所以今天编辑与大家简单介绍下网页字体大小怎么设置。 其实很多朋友出现网页字体变大或变小都…

网页字体设置你了解吗?

转自&#xff1a;http://ued.ctrip.com/blog/?p3589 以前做项目的时候就依葫芦画瓢的设置 { font-family:arial,”microsoft yahei”,simsun,sans-self; } 等类似的字体&#xff0c;然而当更多的设备和系统出现后&#xff0c;以前这样的设置已不能满足网页在各设备上的显示需求…

mac html字体设置,Mac Win 网页字体显示方案

Mac在诞生的时候就把对字体处理尽可能接近原貌成为它很大的一个卖点,而在这些年亲身使用后,个人感觉Mac下的字体确实看起来比Win下舒服些,特别是在浏览网页时,字体比较“珠圆玉润”,可惜的是Mac目前并不是主流,大多数还是Win用户。所以即使你所使用是Mac,在设计仍然要记…