shfileoperation 百科内容来自于: 百度百科

概况

函数功能描述:文件操作,与 Shell 的动作相同.

Delphi

: =====================================
functionCopyDir(const SourceDir,DestDir: string): Boolean;
var
lpFileOp: TSHFileOpStruct;
begin
withlpFileOp do
begin
Wnd := Application.Handle;
wfunc := FO_COPY;
pFrom := pchar(SourceDir);
pTo := pchar(DestDir);
fFlags := FOF_ALLOWUNDO;
hNameMappings := nil;
lpszProgressTitle := nil;
fAnyOperationsAborted := false;
end; Result:= (SHFileOperation(lpFileOp) = 0);end; usesShellApi;//

VC

=============================================
函数原型:
int SHFileOperation( _Inout_ LPSHFILEOPSTRUCT lpFileOp);
需要的库文件:
#include <Shlwapi.h>
#pragma comment (lib,"Shlwapi.lib")
参数
lpFileOp : 一个指向SHFILEOPSTRUCT结构的指针
返回值:
返回0成功,
SHFILEOPSTRUCT结构说明
typedef struct _SHFILEOPSTRUCT {
HWND hwnd;
UINT wFunc;
PCZZTSTR pFrom;
PCZZTSTR pTo;
FILEOP_FLAGS fFlags;
BOOL fAnyOperationsAborted;
LPVOID hNameMappings;
PCTSTR lpszProgressTitle;
} SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;

  hwnd; //父窗口句柄, 0为桌面
wFunc; 功能标识
FO_COPY 复制
FO_DELETE 删除
FO_MOVE 移动
FO_RENAME 重命名
pFrom 源文件或者源文件夹,(source file)
pTo 目的文件或文件夹 (destination)
fFlags 控制文件的标志位
FOF_ALLOWUNDO 准许撤销
FOF_CONFIRMMOUSE 没有被使用,,,
FOF_FILESONLY
通配符的文件名( *.* )只对文件(不是文件夹)进行操作。
FOF_MULTIDESTFILES
The pTo member specifies multiple destination files (one for each source file in pFrom)
rather than one directory where all source files are to be deposited.
(不知道怎么翻译过来,大家体验一下精髓)
FOF_NOCONFIRMATION 不出现任何对话框
FOF_NOCONFIRMMKDIR 创建文件夹的时候不用确认
FOF_NO_CONNECTED_ELEMENTS
Version 5.0适用,,不移动连接文件(connected files),只移动特定文件
FOF_NOCOPYSECURITYATTRIBS
Version 4.71适用,,复制移动文件的时候不复制安全属性,而是为文件指定新的安全属性
FOF_NOERRORUI 如果发生错误, 不要 显示对话框给用户
FOF_NORECURSEREPARSE 没有被使用
FOF_NORECURSION 不递归目录
FOF_NO_UI
Windows Vista中,默默的进行操作,不给用户呈现任何UI。
这相当于FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI
|FOF_NOCONFIRMMKDIR 。
FOF_RENAMEONCOLLISION 移动复制的时候如果名字重名,自动分配新名字
FOF_SILENT 不显示进度条提示框
FOF_SIMPLEPROGRESS 显示一个进度条,但不显示单个文件名,
FOF_WANTMAPPINGHANDLE
如果指定了FOF_RENAMEONCOLLISION,说明此时是在重命名,
分配一个名称映射对象,其中包含他们的旧的和新的名字到hNameMappings成员。
如果不再使用,需要用SHFreeNameMappings释放。
FOF_WANTNUKEWARNING
当一个文件被永久删除的时候,弹出警告框
===================

vb.

Public Structure SHFILEOPSTRUCT
Dim hwnd As IntPtr
Dim wFunc As Integer
Dim pFrom As String
Dim pTo As String
Dim fFlags As Short
Dim fAnyOperationsAborted As Integer
Dim hNameMappings As IntPtr
Dim lpszProgressTitle As String
End Structure
Public Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (ByRef lpFileOp As SHFILEOPSTRUCT) As Integer
======================

vb

Type SHFILEOPSTRUCT
hWnd As Long
wFunc As Long
pFrom As String '必须用 pFrom & vbNullChar & vbNullChar
pTo As String '同pFrom
fFlags As Integer
fAnyOperationsAborted As Boolean
hNameMappings As Long
lpszProgressTitle As String
End Type
Public Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
=======================
wFunc 可以为:
/FO_MOVE 0x0001 移动文件
FO_COPY 0x0002 复制文件
FO_DELETE 0x0003 删除 文件,只使用 pFrom
FO_RENAME 0x0004 文件重命名
fFlags可以为:
FOF_MULTIDESTFILES 0x0001 //pTo 指定了多个目标文件,而不是单个目录
FOF_CONFIRMMOUSE 0x0002
FOF_SILENT 0x00044 // 不显示一个进度对话框
FOF_RENAMEONCOLLISION 0x0008 // 碰到有抵触的名字时,自动分配前缀
FOF_NOCONFIRMATION 0x0010 // 不对用户显示提示
FOF_WANTMAPPINGHANDLE 0x0020 // 填充 hNameMappings 字段,必须使用 SHFreeNameMappings 释放
FOF_ALLOWUNDO 0x0040 // 允许撤销
FOF_FILESONLY 0x0080 // 使用 *.* 时, 只对文件操作
FOF_SIMPLEPROGRESS 0x0100 // 简单进度条,意味者不显示文件名。
FOF_NOCONFIRMMKDIR 0x0200 // 建新目录时不需要用户确定
FOF_NOERRORUI 0x0400 // 不显示出错用户界面
FOF_NOCOPYSECURITYATTRIBS 0x0800 // 不复制 NT 文件的安全属性
FOF_NORECURSION 0x1000 // 不递归目录
返回值:
函数成功返回 0 ,失败返回非 0 。
例子:
1. 将 C:\Test.txt 拷贝到 D:\
SHFILEOPSTRUCT lpsh;
ZeroMemory(&lpsh,sizeof(lpsh));
lpsh.hwnd= HWND_DESKTOP;
lpsh.fFlags=FOF_NOCONFIRMATION|FOF_SIMPLEPROGRESS ;
lpsh.wFunc=FO_COPY; // FO_MOVE 则是移动
lpsh.pFrom= "C:\Test.txt";
lpsh.pTo = "D:\";
if( 0 != SHFileOperation(&lpsh))
{AfxMessageBox("复制文件出错,请检查");return ;}
2. 删除 D:\Test.txt
SHFILEOPSTRUCT lpsh;
ZeroMemory(&lpsh,sizeof(lpsh));
lpsh.hwnd= HWND_DESKTOP;
lpsh.fFlags=FOF_NOCONFIRMATION|FOF_SIMPLEPROGRESS ;
lpsh.wFunc=FO_DELETE;
lpsh.pFrom= "D:\Test.txt";
if( 0 != SHFileOperation(&lpsh))
{AfxMessageBox("删除文件出错,请检查");return ;}
3.重命名
SHFILEOPSTRUCT lpsh;
ZeroMemory(&lpsh,sizeof(lpsh));
lpsh.hwnd= HWND_DESKTOP;
lpsh.fFlags=FOF_NOCONFIRMATION|FOF_SIMPLEPROGRESS ;
lpsh.wFunc=FO_RENAME;
lpsh.pFrom= "D:\Test.txt";
lpsh.pTo = "D:\Test2.txt";
if( 0 != SHFileOperation(&lpsh))
{AfxMessageBox("重命名文件出错!");return ;}
4.VB
Public Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
Public Const FO_COPY = &H2
Public Const FOF_ALLOWUNDO = &H40
Public Sub ShellCopyFile(Source As String, Dest As String)
Dim result As Long
Dim fileop As SHFILEOPSTRUCT
With fileop
.hwnd = 0
.wFunc = FO_COPY
.pFrom = Source & vbNullChar & vbNullChar
.pTo = Dest & vbNullChar & vbNullChar
.fFlags = FOF_ALLOWUNDO
End With
result = SHFileOperation(fileop)
If result <> 0 Then
'Msgbox the error that occurred in the API.
MsgBox Err.LastDllError, vbCritical Or vbOKOnly
Else
If fileop.fAnyOperationsAborted <> 0 Then
MsgBox "Operation Failed", vbCritical Or vbOKOnly
End If
End If
End Sub
$firstVoiceSent
- 来自原声例句
小调查
请问您想要如何调整此模块?

感谢您的反馈,我们会尽快进行适当修改!
进来说说原因吧 确定
小调查
请问您想要如何调整此模块?

感谢您的反馈,我们会尽快进行适当修改!
进来说说原因吧 确定