在Windows的shellapi文件中定义了一个名为SHFileOperation()的外壳函数,用它可以实现各种文件操作,如文件的拷贝、删除、移动等,该函数使用起来非常简单,它只有一个指向SHFILEOPSTRUCT结构的参数。使用SHFileOperation()函数时只要填写该专用结构--SHFILEOPSTRUCT,告诉Windows执行什么样的操作,以及其它重要信息就行了。SHFileOperation()的特别之处在于它是一个高级外壳函数,不同于低级文件处理。当调用SHFileOperation操作文件时,相应的外壳拷贝处理器(如果有的话)被调用。如在删除某个文件时,SHFileOperation会将删除的文件放到Recycle Bin中。SHFileOperation()函数的原形为:

WINSHELLAPI int WINAPI SHFileOperation (LPSHFILEOPSTRUCT lpFIleOp);

  函数中参数类型为一个LPSHFILEOPSTRUCT结构,它包含有进行文件操作的各种信息,其具体的结构如下:

Typedef struct _ShFILEOPSTRUCT
{
HWND hWnd; //消息发送的窗口句柄;
UINT wFunc; //操作类型
LPCSTR pFrom; //源文件及路径
LPCSTR pTo; //目标文件及路径
FILEOP_FLAGS fFlags; //操作与确认标志
BOOL fAnyOperationsAborted; //操作选择位
LPVOID hNameMappings; //文件映射
LPCSTR lpszProgressTitle; //文件操作进度窗口标题
}SHFILEOPSTRUCT, FAR * LPSHFILEOPSTRUCT;

  在这个结构中,hWnd是指向发送消息的窗口句柄,pFrom与pTo是进行文件操作的源文件名和目标文件名,它包含文件的路径,对应单个文件的路径字符串,或对于多个文件,必须以NULL作为字符串的结尾或文件路径名之间的间隔,否则在程序运行的时候会发生错误。另外,pFrom和pTo都支持通配符*和?,这大大方便了开发人员的使用。例如,源文件或目录有两个,则应是:char pFrom[]="d:\\Test1\0d:\\Text.txt\0",它表示对要D:盘Test目录下的所有文件和D:盘上的Text.txt文件进行操作。字符串中的"\\"是C语言中的'\'的转义符,'\0'则是NULL。wFunc 是结构中的一个非常重要的成员,它代表着函数将要进行的操作类型,它的取值为如下:

  FO_COPY: 拷贝文件pFrom到pTo 的指定位置。

  FO_RENAME: 将pFrom的文件名更名为pTo的文件名。

  FO_MOVE: 将pFrom的文件移动到pTo的地方。

  FO_DELETE: 删除pFrom指定的文件。

  使用该函数进行文件拷贝、移动或删除时,如果需要的时间很长,则程序会自动在进行的过程中出现一个无模式的对话框(Windows操作系统提供的文件操作对话框),用来显示执行的进度和执行的时间,以及正在拷贝、移动或删除的文件名,此时结构中的成员lpszProgressTitle显示此对话框的标题。fFlags是在进行文件操作时的过程和状态控制标识。它主要有如下一些标识,也可以是其组合:

  FOF_FILESONLY:执行通配符,只执行文件;

  FOF_ALLOWUNDO:保存UNDO信息,以便在回收站中恢复文件;

  FOF_NOCONFIRMATION:在出现目标文件已存在的时候,如果不设置此项,则它会出现确认是否覆盖的对话框,设置此项则自动确认,进行覆盖,不出现对话框。

  FOF_NOERRORUI:设置此项后,当文件处理过程中出现错误时,不出现错误提示,否则会进行错误提示。

  FOF_RENAMEONCOLLISION:当已存在文件名时,对其进行更换文提示。

  FOF_SILENT:不显示进度对话框。

  FOF_WANTMAPPINGHANDLE:要求SHFileOperation()函数返回正处于操作状态的实际文件列表,文件列表名柄保存在hNameMappings成员中。

  SHFILEOPSTRUCT结构还包含一个SHNAMEMAPPING结构的数组,此数组保存由SHELL计算的每个处于操作状态的文件的新旧路径。

  在使用该函数删除文件时必须设置SHFILEOPSTRUCT结构中的神秘FOF_ALLOWUNDO标志,这样才能将待删除的文件拷到Recycle Bin,从而使用户可以撤销删除操作。需要注意的是,如果pFrom设置为某个文件名,用FO_DELETE标志删除这个文件并不会将它移到Recycle Bin,甚至设置FOF_ALLOWUNDO标志也不行,在这里你必须使用全路径名,这样SHFileOperation才会将删除的文件移到Recycle Bin。

转载于:https://www.cnblogs.com/liunatural/archive/2009/07/08/1519019.html

使用Windows的SHFileOperation外壳函数实现文件操作相关推荐

  1. feof()函数的文件操作

    feof()函数在文件操作时,用于判断文件是否结束.如果文件结束,则返回非0值,否则返回0. 对于文件来说,无论是空文件,还是存有信息的文件.文档的结尾都有一个隐藏字符"EOF", ...

  2. Python函数 (函数与文件操作)

    函数概念 定义函数 调用函数 作用域 文件操作 访问模式  说明 文件读取 函数练习 打印一个一条横线函数 打印多条线 求三个数和 古诗的练习 函数概念 开发程序的时候,需要某个模块多次,但是为了提高 ...

  3. python第三节函数,文件操作

    文件操作#以读的方式打开文件# f=open('c.txt',encoding='utf-8')# print(f)# data = f.read() #以读的方式打开# print(data)# p ...

  4. 第三章:Python基础の函数和文件操作实战

    本課主題 Set 集合和操作实战 函数介紹和操作实战 参数的深入介绍和操作实战 format 函数操作实战 lambda 表达式介绍 文件操作函数介紹和操作实战 本周作业 Set 集合和操作实战 Se ...

  5. Part1_4 python函数、文件操作、异常处理

    目录 函数 文件操作 异常处理 函数 #函数的定义 def printinfo():print("----------")print("人生苦短,我用python&quo ...

  6. python中f点flush是什么函数_Python文件操作及内置函数flush原理解析

    1.打开文件得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 示例文件 '你好呀' 我是于超 嗯 再见 文件操作基本流程 f=open('chenli',encoding='ut ...

  7. python sorted下标_全!Python基础之原生数据类型、判断和循环、函数和文件操作合集...

    长文预警! Python基础系列会将基础内容大致分为三到五个板块,每块着重讲一方面,知识不会很难,主要是以小例子的形式解读,如果你已经入门Python,希望可以帮你温习一下:如果你想入门Python, ...

  8. 牛逼!Python函数和文件操作(长文系列第3篇)

    系列第三篇来说一下函数和文件.函数在编程中是一个很重要的角色,我们可以将若干个语句组合形成一个函数,它可以接受传入参数,并在内部进行相关计算后产生输出,将语句封装成函数是为了避免重复使用几个语句造成代 ...

  9. python中遍历结构可以是哪些数据类型_全!Python基础之原生数据类型、判断和循环、函数和文件操作合集...

    长文预警! Python基础系列会将基础内容大致分为三到五个板块,每块着重讲一方面,知识不会很难,主要是以小例子的形式解读,如果你已经入门Python,希望可以帮你温习一下:如果你想入门Python, ...

最新文章

  1. 【Qt】QStackedWidget:将多个窗口控件放入堆中,每次只显示一个窗口控件
  2. FPGA 中的latch 锁存器
  3. 机器人编程语言python-个人微信接入图灵机器人(基于Python)
  4. Android 菜单(OptionMenu)大全 建立你自己的菜单
  5. 原来访问网页弹出cookie是这样的
  6. java gzipoutputstream_java – GZIPInputStream逐行读取
  7. android handler的机制和原理_Android消息机制的原理及源码解析
  8. 【SQL注入01】SQL注入漏洞简介、原理及类型
  9. 必备的海外贸易沟通工具 - intbell使用教程
  10. 解压缩软件(winrar中文版)pjb 附使用说明
  11. JS-a标签下载文件
  12. Mosquitto安装配置websockets
  13. 中兴android手机驱动,驱动天空 - 手机驱动 - 中兴手机 ZTE
  14. vscode 扩展宿主意外终止
  15. gitbook build 生成的HTML无法跳转问题
  16. 在VS 2019中使用HDF5的C API遍历HDF5数据集
  17. mysqlbinlog恢复mysql表数据
  18. 疯子的匣子_人工智能扮演``疯子''来像孩子一样学习语法
  19. 计算机输入知识竞赛简讯,计算机学院积极参与“不忘初心之感知我矿大”知识竞赛...
  20. 【Vivado那些事儿】Vivado中运行时出现visual c++运行错误的解决办法

热门文章

  1. redis主从复制、高可用和集群
  2. mysql 索引 二叉树_MySQL 的索引,为什么是 B+而不是平衡二叉树
  3. 使用npm打包后生成的package.json中重要字段含义
  4. 1022 Digital Library
  5. Python 函数知识汇总
  6. html中item属性,项目id(属性) | itemid (attribute)
  7. java培训机构如何选择适合自己的
  8. SpringMvc+ajax实现文件跨域上传
  9. 怎样做才是最优雅方式切换 web 项目数据源 ?
  10. NAS存储对称和非对称结构之前的区别概述