Windows API——SHFileOperation——文件操作

1 int SHFileOperation( LPSHFILEOPSTRUCT lpFileOp);

如果执行成功返回0.

typedef struct _SHFILEOPSTRUCT {
	HWND hwnd;			//指向发送消息的窗口
	UINT wFunc;			//执行的操作
	LPCTSTR pFrom;			//源文件名
	LPCTSTR pTo;			//目标文件名
	FILEOP_FLAGS fFlags;		//操作与确认标识
	BOOL fAnyOperationsAborted;	//操作是否终止
	LPVOID hNameMappings;		//文件映射
	LPCTSTR lpszProgressTitle;	//进度条标题
} SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;

参数说明:

wFunc: 要执行的操作

FO_COPY:	复制
FO_DELETE:	删除
FO_MOVE:	移动
FO_RENAME:	重命名

pFrom:源文件名

MSDN上说要以两个\0结束,所以一般的字符串必须还要加上一个\0

比如:

// 错误的用法
LPTSTR pszSource = L"C:\\Windows";

// 正确的用法
LPTSTR pszSource = L"C:\\Windows\0";

对于CString,正确的用法是这样的

CString strSource("C:\\Windows");
strSource += '\0';//注意必须是'\0'而不是"\0"

fFlags: 执行标识

FOF_SILENT 		//不产生正在复制的对话框
FOF_NOCONFIRMMKDIR	//如果目的目录不存在,就默认创建
FOF_NOCONFIRMATION 	//不出现确认文件替换对话框(默认替换原来的文i件)
FOF_NOERRORUI		//不出现错误对话框

注:

注:最好不要同时使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR,因为FOF_NOCONFIRMMKDIR屏蔽了missing directory Error,但FOF_NOERROR又屏蔽了missing directory Error,那么在同时使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR时也阻止了新目录安静(没有用户确认要产生新目录的对话框)的产生!!那么如何同时使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR?

就必须先确认pTo所指定的目录存在即可

BOOL MakeSureDiretoryPathExists(LPCSTR DirPath); //使用它要包含imagehlp.h和imagehlp.lib

如何判断同时存在FOF_NOERRORUI,FOF_NOCONFIRMMKDIR

=====

如果出现弹出"无法删除 文件无法:读取源文件或磁盘文.",可:FOF_NOCONFIRMATION|FOF_NOCONFIRMMKDIR|FOF_NOERRORUI

=====

FOF_RENAMEONCOLLISION	//有重复文件时自动重命名
FOF_ALLOWUNDO     	//将文件放入回收站,否则直接删除,一般这个最好做默认

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

FOF_FILESONLY		//执行通配符,只执行文件;
FOF_ALLOWUNDO		//保存UNDO信息,以便在回收站中恢复文件;
FOF_NOCONFIRMATION	//在出现目标文件已存在的时候,如果不设置此项,则它会出现确认是否覆盖的对话框,设置此项则自动确认,进行覆盖,不出现对话框。
FOF_NOERRORUI		//设置此项后,当文件处理过程中出现错误时,不出现错误提示,否则会进行错误提示。
FOF_RENAMEONCOLLISION	//当已存在文件名时,对其进行更换文提示。
FOF_SILENT		//不显示进度对话框。
FOF_WANTMAPPINGHANDLE

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

例子:

CString strSrc("D:\\test1");
CString strDes("D:\\test2");
strSrc += '\0';//必须加'\0'
strDes += '\0';
SHFILEOPSTRUCT FileOp;
FileOp.fFlags = FOF_ALLOWUNDO|FOF_MULTIDESTFILES|FOF_SIMPLEPROGRESS;//
CString str("正在进行中");
str += '\0';
FileOp.lpszProgressTitle = str;
FileOp.hwnd =m_hWnd;
FileOp.hNameMappings = NULL;
FileOp.pFrom = strSrc; //
FileOp.pTo = strDes;
FileOp.wFunc = FO_COPY;

BOOL bOk;
bOk = SHFileOperation(&FileOp);
if (!FileOp.fAnyOperationsAborted)//终止
{
    if(bOk)
        MessageBox(_T("操作出现错误!"));
    else
        MessageBox(_T("操作完成!"));
}
else
{
    MessageBox(_T("操作已终止!");
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 13:05:35

Windows API——SHFileOperation——文件操作的相关文章

Web API与文件操作

前段时间,一直有练习ASP.NET MVC与Web API交互,接下来,Insus.NET再做一些相关的练习,Web API与文件操作,如POST文件至Web API,更新或是删除等. 不管怎样,先在数据库创建一张表,用来存储上传的文件.本实例中是把文件存储过数据库的. CREATE TABLE ApiFileDemo ( [Afd_nbr] INT IDENTITY(1,1) PRIMARY KEY NOT NULL, [Picture] [image] NULL, [PictureType]

Xamarin.Forms学习之Platform-specific API和文件操作

这篇文章的分享原由是由于上篇关于Properties的保存不了,调用SavePropertiesAsync()方法也不行,所以我希望通过操作文件的方式保存我的需要的数据,然后我看了一下电子书中的第二十章和需要相关知识的第九章,这篇文章中的内容则是我学习这两章的一点记录和分享,还是那样,有错请留言指正,谢谢! 不同的平台存在着一些特定的API,通过在电子书中两章的学习,实践一下如何调用这些API和将这些API封装成公共的库,供以后的项目调用.以一个显示平台信息的小实例开始做一个简单的演示,其运行效

【API】文件操作编程-CreateFile、WriteFile、SetFilePointer

1.说明 很多黑客工具的实现是通过对文件进行读写操作的,而文件读写操作实质也是对API函数的调用. 2.相关函数 CreateFile : 创建或打开文件或I/O设备.最常用的I/O设备如下:文件,文件流,目录,物理磁盘卷,控制台缓冲,磁带驱动器,通信资源,邮槽,和管.函数返回一个句柄,可以根据文件或设备和指定的标志和属性来访问各种类型的I/O文件或设备. HANDLE WINAPI CreateFile( _In_ LPCTSTR lpFileName, _In_ DWORD dwDesire

PoEdu - Windows阶段班 【Po学校】Windows编程 Lesson004_003-2 文件操作

001_函数的不同版本 HANDLE : CreateFile()函数返回一个内核对象的句柄 WINAPI : 一种调用约定,调用方式. _In_ 与 _In_opt_ : 本身没有意义,一个说明宏,来标明这个参数的性质. _In_ 说明此参数是"输入型"参数 _In_Opt_ 说明此参数是"输入指针型"参数 _Out_ 说明此参数是"输出型"参数 输出参数要保障:输出型参数,具有可操作的空间 VS2015中,CreateFile()是一个宏:W

C# 使用 Windows API 发送文件到打印机

最近需要做一个打印的功能,于是在网上找到了这么一个方法. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public class DOCINFOA { [MarshalAs(UnmanagedType.LPStr)] public string pDocName; [MarshalAs(UnmanagedType.LPStr)] public string pOutputFile; [MarshalAs(Unmanag

C# WPF Application 下的文件操作

好气哦,电脑好烂,每天花大把的时间在等电脑反应上. 没有钱买新电脑,连组台式机的钱都没有.好气哦. 啊啊啊啊文件操作是什么鬼???C++下我都懵了,C#下好多东西要学!!!我不会!我不会!我不会!!!啊啊啊啊啊啊!!! 怎么办啊?用windows API写我要怎么样移植到Linux下? WINDOWS API的文件操作 一.常用函数 CreateFile 创建.打开文件 ReadFile 读取文件内容 WriteFile 写入文件内容 SetFilePointer 移动文件指针 SetEndOf

Windows API教程文件系统

本篇文章主要介绍了"Windows API教程文件系统",主要涉及到Windows API教程文件系统方面的内容,对于Windows API教程文件系统感兴趣的同学可以参考一下. 索引 概念简介 文件对象 文件流 文件句柄 文件指针 文件系统操作 常见 API 高级文件操作 本讲程序功能列表 CreateFile 具体参数 返回值 DeleteFile 参数 返回值 CopyFile.MoveFile.FindFirstFile ReadFile GetCurrentDirectory

C语言第十二讲,文件操作.

C语言第十二讲,文件操作. 一丶文件操作概述 在操作系统中,我们的文档都称为文件.操作系统也为我们提供了接口进行操作.不同语言都是使用的相同的接口,只不过封装的上层接口不一样 操作文件的步骤 打开文件->读写文件->关闭文件. 二丶文件流的概述. 文件流称为 输入流和输出流.  其实就是从内存写数据到磁盘.和从磁盘读数据到内存. 内存->磁盘  称为输出流. 输出到磁盘 磁盘->内存 称为输入流.读取到内存. 三丶文件的打开和关闭. 1.操作原型. FILE *fopen(char

C语言 文件操作API介绍

文件的基本概念 所谓“文件”是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名. 实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件.库文件 (头文件)等.文件通常是驻留在外部介质(如磁盘等)上的, 在使用时才调入内存中来.从不同的角度可对文件作不同的分类.从用户的角度看,文件可分为普通文件和设备文件两种. 普通文件是指驻留在磁盘或其它外部介质上的一个有序数据集,可以是源文件.目标文件.可执行程序:也可以是一组待输入处理的原始数据,或者是一组输出的结果.