当前位置:首页 > 编程学习 > SHFileOperation介绍

SHFileOperation介绍

编程学习2007-04-2962680

SHFileOperation

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

函数原型:

#include<shellapi.h>
WINSHELLAPI int WINAPI  SHFileOperation(LPSHFILEOPSTRUCT lpFileOp);

参数:

typedef struct _SHFILEOPSTRUCT
{
    HWND            hwnd;    //父窗口句柄
    UINT            wFunc;  //要执行的动作
    LPCTSTR          pFrom;  //源文件路径,可以是多个文件
    LPCTSTR         pTo;     //目标路径,可以是路径或文件名
    FILEOP_FLAGS    fFlags; //标志,附加选项
    BOOL            fAnyOperationsAborted; //是否可被中断
    LPVOID           hNameMappings;         //文件映射名字,可在其    它 Shell 函数中使用
    LPCTSTR          lpszProgressTitle; // 只在 FOF_SIMPLEPROGRESS 时,指定对话框的标题。 
} SHFILEOPSTRUCT,  FAR *LPSHFILEOPSTRUCT;

===================

vb.net

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 Sub


扫描二维码推送至手机访问。

版权声明:本文由海阔天空发布,如需转载请注明出处。

本文链接:https://apull.net/html/20070429101.html

分享给朋友:

相关文章

怎样学习C语言

怎样学习C语言

怎样学习C语言很多人对学习C语言感到无从下手,经常问我同一个问题:究竟怎样学习C语言?我是一个教师,已经开发了很多年的程序,和很多刚刚起步的人一样,学习的第一个计算机语言就是C语言。经过这些年的开发,我深深的体会到C语言对于一个程序设计人员多么的重要,如果不懂C语言,你想写底层程序这几乎听起来很可笑,不懂C语言,你想写出优秀高效的程序,这简直就是天方夜谭。为什么C语言如此重要呢?第一:C语言语法结构很简洁精妙,写出的程序也很高效,很便于描述算法,大多数的程序员愿意使用C语言去...

VB.NET 用ShellExecuteEx 打开系统文件属性对话框 模块

VB.NET 用ShellExecuteEx 打开系统文件属性对话框 模块

' ' VB.NET 调用系统文件属性对话框模块 ' ' by: Apull ' QQ:374237545 ' http://www.apull.net ' 2007-6-9 ' ' Imports System.Runtime.InteropServices     Mod...

VB/VB.net 只允许运行一个实例

VB/VB.net 只允许运行一个实例

VB/VB.net  只允许运行一个实例       by:  Apull  VB中的实现方法VB如何防止程序被重复加载,也就是只允许运行一个实例,一般有2种方法。一,直接用VB提供的APP对象的PrevInstance方法。PrevInstance的返回值为True则说明已经有一个实力在运行。If App.PrevInstance Then Msgbox "已经有一个实例在运行" End if这个...

致面向对象技术初学者的一封公开信

致面向对象技术初学者的一封公开信

 致面向对象技术初学者的一封公开信 Alistair Cockburn 著(1996 年2 月),袁峰 译介绍 首先我要解释一下为什么会写这封公开信。这似乎已经成了一种习惯,但这个步骤还是需要的。过去6 年中, 我曾经无数次地在饭店、酒吧、旅店大厅等各种地方以同一种方式度过愉快而漫长的夜晚:和同样追求真理、光明和智慧的伙伴一起探讨面向对象的真谛。现在,我已经可以回答很多当年我遇到的问题。这些同样的问题也在困扰着我的一位新同事,在一家饭店里,我花了整整一个晚上和他讨...