SHFileOperation

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 If

End Sub

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章