Windows SHELL命令在VBA使用

  想要文件關閉的時候進行備份?想要把DOS命令加入到日常中的應用中來?沒問題,用SHELL就行了。

如你的前台一啟動的時候就自動建立虛擬盤,可以在LOAD事件裡加入:

shell “subst X: H:\ushare\MRP”

這樣就可以在文件打開的時候自動把H:\ushare\MRP映射成X盤,有利於文件分發。

同理,也可以加入其它的如XCOPY命令來備份。

當然,你要是把DOS命令做成一個BAT文件執行,用SHEEL “PATH「,1 來執行.SHEEL語句後面的那個1的意思如下:

常數 值 描述

vbHide        0 窗口是隱藏的,並且焦點被傳遞給隱藏窗口。

vbNormalFocus   1 窗口擁有焦點,並且恢復到原來的大小與位置。

vbMinimizedFocus  2 窗口縮小為圖符並擁有焦點。

vbMaximizedFocus   3 窗口最大化並擁有焦點。

vbNormalNoFocus   4 窗口被恢復到最近一次的大小與位置。當前活動窗口仍為活動窗口。

vbMinimizedNoFocus 6 窗口縮小為圖符。當前活動窗口仍為活動窗口。

VBA SHELL語句用法心得–轉錄

一、關於Rundll32.exe

過去,你曾經為了自己編的文件管理器能Format 磁盤、瀏覽器能自動撥號連接而求助於那位高傲的 API。現在,Rundll32.exe向你提供了更為平易近人的 方法來做到這些功能。

例如,要調用關機程序則為:shell 「rundll32.exe user.exe,exitwindOws」。

調用模塊 命 令 結 果

rundll32.exe shell32.dll,Control_RunDLL 打開控制面板

SHELL32.DLL

rundll32.exe shell32,SHHelpShortcuts_Rundll PrintersFolder 打開列印機文件夾

rundll32.exe shell32,SHHelpShortcuts_Rundll FontsFolder 打開字體文件夾

rundll32.exe shell32,SHHelpShortcuts_Rundll AddPrinter 添加新列印機嚮導

rundll32.exe shell32,SHformatDrive 格式化軟盤

SYSDM.CPL

rundll32.exe shell32,Control_RunDLL sysdm.cpl 系統屬性,常規

rundll32.exe shell32,Control_RunDLL sysdm.cpl,,l 系統屬性,設備管理器

rundll32.exe shell32,Control_RunDLL sysdm.cpl,,3 系統屬性,性能

rundll32.exe shell32,Control_RunDLL sysdm.cpl @1 添加新硬體嚮導

APPWIZ.CPL

rundll32.exe shell32,Control_RunDLL appwiz.cpl,,1 添加/刪除程序

rundll32.exe shell32,Control_RunDLL appwiz.cpl,,2 安裝Windows部件

rundll32.exe shell32,Control_RunDLL appwiz.cpl,,3 製作啟動盤

DISKCOPY.DLL

rundll32.exe diskcopy.dll,DiskcopyRundll 復制磁盤

RNAUI.DLL

rundll32.exe rnaui.dll,RnaDial x (x為連接名稱) 打開撥號邊接對話框,若已連接,則顯示連接狀態對話框

rundll32.exe rnaui.dll,RnaWizard 新建撥號連接嚮導

DESK.CPL

rundll32.exe shell32,Control_RunDLL desk.cpl,,0 選擇桌面背景

rundll32.exe shell32,Control_RunDLL desk.cpl,,1 選擇螢幕保護

rundll32.exe shell32,Control_RunDLL desk.cpl,,2 選擇外觀

rundll32.exe shell32,Control_RunDLL desk.cpl,,3 設置顯示屬性

MAIN.CPL

rundll32.exe shell32,Control_RunDLL main.cpl @0 設置滑鼠屬性

rundll32.exe shell32,Control_RunDLL main.cpl @1 設置鍵盤屬性,速度

rundll32.exe shell32,Control_RunDLL main.cpl @1,,1 設置鍵盤屬性,語言

rundll32.exe shell32,Control_RunDLL main.cpl @2 打開列印機文件夾

rundll32.exe shell32,Control_RunDLL main.cpl @3 打開字體屬性

rundll32.exe shell32,Control_RunDLL main.cpl @4 設置輸入法

MODEM.CPL

rundll32.exe shell32,Control_RunDLL modem.cpl,,add 添加調制解調器嚮導

MMSYS.CPL

rundll32.exe shell32,Control_RunDLL mmsys.cpl @1 設置聲音屬性(也可以加入,,0到,,4的參數以選擇不同的標籤)

UESR.EXE

rundll32.exe user.exe,exitwindows 關閉計算機

二、如何確定Shell語句調用的程序已經關閉

這個標題確實太長,但它確實概括了本節的內容。 當你需要等待由Shell啟動的應用程序運行完畢時, 便會發現Shell語句只管調用,之後就撒手不管了,於 是我們不得不動用一下API函數了。當然我們可以用 API來完成全部的工作,但是如果那樣的話,我們將要 面臨CreateProcess這個非常複雜的函數,光寫下它 和相關結構類型的宣告就超出一頁紙了。別誤會,我 說這些的目的只是為了讓大家體會到下面我們將要做 的是多麼簡單的事。

只需按以下步驟step by step,便OK了。

1.新建一個項目,在窗體上放一個command1,再 添加一個Module。

2. 在Module中寫入如下代碼:

Option Explicit

以下聲明了OpenProcess,GetExitCodeProcess 和Closeandle 三個API函數

Public Declare Function OpenProcess Lib”ker nel32″(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long)As Long

Public Declare Function GetExitcodeProcess Lib 「kernel32」(ByVal hProcess As Long, 1pExitcode As Long) As Long

Public Declare Function Closellandle Lib “Ker nel32」(ByVal hobject As Long) As Long

Publi Const PROCESS_QUERY_INFORMATION= &H400

Public Const STATUS_PENDING = &H103&

3.打開窗體的代碼窗口,寫入如下代碼:

Option Explicit

Private Sub RunShell(cmdline As String) 這個自定義過程完成了所有工作

Dim hProcess As Long

Dim ProcessId As Long

Dim exitCode As Long

ProcessId = Shell(cmdline,1)’此處利用了 Shell當函數使用時返回的任務標識

hProcess=OpenProcess(PROCESS_QUERY_INFOR MATION,False,ProcessId)

Do

Ca11 GetExitCodeProcess(hProcess,exitcode)

DoEvents

Loop While exitCode = STATUS_PENDING

Call CloseHandle(hProcess)

MsgBox cmdline & “已經關閉。”

End Sub

Private Sub Command1_Click()

RunShell 」notepad.exe」

End Sub

4?按F5運行,單擊Command1運行計事本,關閉 計事本將彈出對話框「notepad.exe 已經關閉。」

注意:由於本程序是用一個Do..Loop循環來偵測 進程的結束,所以那句DoEvents是絕不能少的,不然 你就只能用Ctrl+Break來退出了。

三、激活一個正在運行的程序

讓我們來考慮這樣一種情況:我們在程序中定義 了某一操作是用Shell語句調用Windows的計算器,當 用戶重復這一操作時,計算器已經在運行了。如果簡 單地再使用Shell語句將打開計算器的另一個進程。 這顯然是不合理的。這時我們需要做的是激活已運行 的計算器,下面這段簡單的代碼幫我們達到了目的、 相信大家一看就懂。

Private Declare Function FindWindow Lib 「user32」Alias 「FindWindowA」(ByVal 1pClassName As String,ByVal 1pWindowName As String) As Long

Private Declare Function BringWindowToTop lib 「user32」 (ByVal hwnd As Long)As Long

‘以上聲明了FindWindow和BringWindowToTop兩 個API函數

Private Sub Command1-Click()

Dim hCalcWnd As Long

hCalcwnd = Findwindow(「SciCalc」,」計算器」)

這裡SciCalc是計算器的窗口類名,詳見下一節

lf hCalcWnd=0 Then

Shell(”CALC.EXE”,vbNormalFocus)

Else:BringWindowToTop(hCalcWnd)

End lf

End sub

四、如何獲得窗口的類名

只是看過上節的讀者大部會對窗口的類名提出疑 問,本節就是針對這個問題的。通過本節的內容,你 還能了解到如何跟蹤滑鼠,並找出它正經過哪個窗口。 好,讓我們一步一步地來,這回代碼可能稍多一些。

1.建立一個新項目,在窗體的General Decla rations部分寫入以下代碼,這些語句定義了要用到 的API函數、常量以及結構。

Option Explicit

Dim gbCancel As Boolean

Private Type POINTAPI

X As Long

Y As Long

End Type

Private Declare Function GetCursorPos Lib 「user32″ (1pPoint As POINTAPI) As Long

Private Declare Function WindowFromPoint Lib “user32」(ByVal xPoint As Long,ByVal yPoint As long) As Long

Private DeClare Function GetClassName Lib 「user32」Alias “GetClassNameA」(ByVal hwnd As Long,ByVal 1pClassName As String,ByVal aMaxCount As Long)As Long

2.在窗體上放一個Command1,把標題改成「開 始」,再放一個Label1,以下是事件的代碼,也請大家 在相應位置寫上。

Private Sub Command1_CliCk()

If Command1.Caption =”開始” Then

Command1.Caption = “停止”

Call Track

ElSe

Command1.Caption=”開始”

gbCancel = True

End IF

End Sub

Private Sub Form_Load()

gbCancel = False ‘初始化循環取消變量

End Sub

Private Sub Form_QueryUnload(Cancel As In teger,UnloadMode As Integer)

gbCancel = True ‘確保循環中斷

End Sub

3.最後是關鍵部分,自定義的過程Track。

Sub Track()

Dim PT_Mouse As POINTAPI

Dim 1CurHwnd As Long

Dim 1PrvHwnd As Long

Dim IX As Long,1Y As Long

Dim tClassName As String

Dim 1Result As Long

1PrvHwnd = 0

Do

Call GetCursorPos(PT_Mouse) ‘獲得滑鼠位置

1X =PT_Mouse.x

1Y=PT_Mouse.Y

1CurHwnd = WindowFromPolnt(1X,1Y) ‘獲得鼠 標箭頭下窗口的句柄

If gbCancel = True Then Exit Do

If 1CurHwnd <> 1PrvHWnd Then ‘若兩值不等則 說明經過不同的窗口,保存新值

1PrvHwnd=1CurHwnd

tClassName = String$(256,” “) ‘注意引號間 是空格

1Result = GetClassName(1CurHwnd,tClassName,255) ‘這兩句取出類名

tClassName = Left$(tClassName, InStr (tClassName,vbNullChar) -1)

Labell,Caption = “滑鼠通過:」 & tClassName

‘也可寫1CurHwnd以獲得窗口句柄

End lf

DoEvents ‘決不可少!切記,切記!

Loop

End sub

運行此程序,按下”開始」按鈕後,滑鼠所經過的 窗口的類名將在Labell中顯示出來。

原帖:

http://ryan888.5d6d.com/thread-25879-1-1.html

四、利用API函數來處理文件

通過前面三種方法的介紹,你是否已經覺得足夠了?是的,前面的方法完全可以應付

幾乎所有的文件操作。但是為了普及一下API,展示一下API的魅力,最後向大家介紹

一下如何利用API函數來處理文件。另一方面也是本人對API情有獨鐘,為她做一下廣

告,呵呵。

大家對API的強大也是有所耳聞了,在文件操作方面,API自然毫不遜色。

說明:為了文章簡潔,我們先給出API函數的名稱及功能,其完整的聲明及常數就不

再一一細訴,只在示例中給出其完整用法。

(一)處理驅動器及目錄

下面是windows中提供的對於目錄進行操作的API函數及其功能:

CreateDirectory,CreateDirectoryEx 創建一個新目錄

GetCurrentDirectory 在一個緩沖區中裝載當前目錄

GetDiskFreeSpace,GetDiskFreeSpaceEx 獲取與一個磁盤的組織有關的信息,以及

了解剩餘空間的容量

GetDriveType 判斷一個磁盤驅動器的類型

GetFullPathName 獲取指定文件的完整路徑名

GetLogicalDrives 判斷系統中存在哪些邏輯驅動器字母

GetLogicalDriveStrings 獲取一個字串,其中包含了當前所有邏輯驅動器的根驅動

器路徑

GetSystemDirectory 這個函數能取得Windows系統目錄(System目錄)的完整路徑

名。在這個目錄中,包含了所有必要的系統文件。根據微軟的標準,其他定制控件和

一些共享組件也可放到這個目錄。通常應避免在這個目錄裡創建文件。在網路環境中

,往往需要管理員權限才可對這個目錄進行寫操作

GetTempPath 獲取為臨時文件指定的路徑

GetVolumeInformation 獲取與一個磁盤卷有關的信息

GetWindowsDirectory 這個函數能獲取Windows目錄的完整路徑名。在這個目錄裡,

保存了大多數windows應用程序文件及初始化文件

RemoveDirectory 刪除指定目錄

SetCurrentDirectory 設置當前目錄

SetVolumeLabel 設置一個磁盤的卷標(Label)

下面通過幾個例子來詳細的了解一下其中主要的幾個函數及其用法:

1、GetLogicalDrives

作用:判斷系統中存在哪些邏輯驅動器字母

聲明:Declare Function GetLogicalDrives Lib “kernel32” Alias “GetLogicalDrives

” () As Long

說明:此函數的返回值類型為Long,這個結構中的二進制位標誌著存在哪些驅動器。

其中,位0設為1表示驅動器A:存在於系統中;位1設為1表示存在B:驅動器;以次類推

示例:

Public Sub Get_LogicalDrives()

Dim LDs As Long, Cnt As Long, sDrives As String

LDs = GetLogicalDrives

sDrives = “Available drives:”

For Cnt = 0 To 25

If (LDs And 2 ^ Cnt) <> 0 Then

sDrives = sDrives + ” ” + Chr$(65 + Cnt)

End If

Next Cnt

MsgBox sDrives

End Sub

上面的示例中,我們通過二進制運算,將返回值轉換成字符。如果你的機上有C,D,E

,F,G,H這幾個驅動器,那麼LDs的值就是252,轉成二進制為11111100,從右往左,依

次代表A,B,C,D,…,為0的說明沒有此驅動器字母。大家可以自己試一試。

2、GetDriveType

作用:判斷一個磁盤驅動器的類型

聲明:Declare Function GetDriveType Lib “kernel32” Alias “GetDriveTypeA”

(ByVal nDrive As String) As Long

說明:此函數的返回值類型為Long,如驅動器不能識別,則返回零。如指定的目錄不

存在,則返回1。如執行成功,則用下述任何一個常數指定驅動器類型:DRIVE_REMOVABLE

(表示磁盤可以從驅動器上移走,通常是軟驅), DRIVE_FIXED(磁盤不能從驅動器

上移走,通常為本地硬碟), DRIVE_REMOTE(驅動器是遠程網路驅動器), DRIVE_CDROM

(驅動器是CD-ROM驅動器) 或 DRIVE_RAMDISK(驅動器是RAM驅動器)

參數為String類型,包含了驅動器根目錄路徑的一個字串

此函數的功能與FSO的Drive對象的DriveType屬性是一樣的。

示例:

‘定義常數變量

Private Const DRIVE_CDROM = 5 ‘表示光盤驅動器

Private Const DRIVE_FIXED = 3 ‘表示硬碟驅動器

Private Const DRIVE_RAMDISK = 6 ‘表示RAM驅動器

Private Const DRIVE_REMOTE = 4 ‘表示網路驅動器

Private Const DRIVE_REMOVABLE = 2 ‘表示軟盤驅動器

Private Sub Get_DriveType()

Dim temp As Long

temp = GetDriveType(“d:\”) ‘取的d:盤驅動器類型

Select Case temp

Case DRIVE_CDROM

MsgBox “DRIVE_CDROM: 光盤驅動器”

Case DRIVE_FIXED

MsgBox “DRIVE_FIXED: 硬碟驅動器”

Case DRIVE_RAMDISK

MsgBox “DRIVE_RAMDISK: RAM驅動器”

Case DRIVE_REMOTE

MsgBox “DRIVE_REMOTE: 網路驅動器”

Case DRIVE_REMOVABLE

MsgBox “DRIVE_REMOVABLE: 軟盤驅動器”

End Select

End Sub

3、GetDiskFreeSpaceEx

作用:獲取與一個磁盤的組織以及剩餘空間容量有關的信息

聲明:Declare Function GetDiskFreeSpaceEx Lib “kernel32” Alias “GetDiskFreeSpaceExA

” (ByVal lpRootPathName As String, lpFreeBytesAvailableToCaller As LARGE_INTEGER

, lpTotalNumberOfBytes As LARGE_INTEGER, lpTotalNumberOfFreeBytes As LARGE_INTEGER

) As Long

說明:此函數的返回值類型為Long,非零表示成功,零表示失敗。會設置GetLastError

.

在採用FAT16格式的windows95系統中,如一個驅動器(分區)的容量超過了2GB,則

不應使用這個函數。此時,這個函數能識別的最大分區容量只有2GB

參數說明:

lpRootPathName String,不包括卷名的磁盤根路徑名

lpFreeBytesAvailableToCaller LARGE_INTEGER,指定一個變量,用於容納調用者可

用的字節數量

lpTotalNumberOfBytes LARGE_INTEGER,指定一個變量,用於容納磁盤上的總字節數

lpTotalNumberOfFreeBytes LARGE_INTEGER,指定一個變量,用於容納磁盤上可用的

字節數

LARGE_INTEGER結構用來代表一個64位帶符號的整數值,它的定義如下:

Type LARGE_INTEGER ‘ 8 Bytes

lowpart As Long

highpart As Long

End Type

其中lowpart為 Long,指定低32位,highpart 為 Long,指定高32位。

示例:雖然此函數能識別的最大分區容量只有2GB,但通過調整,對大於2G的仍然能

得出正確容量。以下的調整公式是本人通過逆向推算出來的,至於其中的原理也不是

很清楚,大家可一測試一下。

Private Sub Get_DiskFreeSpaceEx()

Dim temp As Long, Dms$

Dim tempa, tempb, tempc

Dim RootPathName As String

Dim FreeBytesAvailabletoCaller As LARGE_INTEGER

Dim TotalNumberOfBytes As LARGE_INTEGER

Dim TotalNumberOfFreeBytes As LARGE_INTEGER

RootPathName = “d:”

‘取得磁盤空間

temp = GetDiskFreeSpaceEx(RootPathName, FreeBytesAvailabletoCaller, TotalNumberOfBytes

, TotalNumberOfFreeBytes)

Dms = Dms + “磁盤容量:” + vbCrLf

tempa = TotalNumberOfBytes.highpart * 2 ^ 32 + IIf(TotalNumberOfBytes.lowpart

> 0, TotalNumberOfBytes.lowpart, TotalNumberOfBytes.lowpart + 2 ^ 32) ‘計

算容量

Dms = Dms + CStr(tempa) + “字節” + vbCrLf

tempa = Format(tempa / 1024 / 1024 / 1024, “0.00”)

Dms = Dms + tempa + “G” + vbCrLf

‘取得磁盤可用空間

Dms = Dms + “磁盤可用空間:” + vbCrLf

tempb = TotalNumberOfFreeBytes.highpart * 2 ^ 32 + IIf(TotalNumberOfFreeBytes

.lowpart > 0, TotalNumberOfFreeBytes.lowpart, TotalNumberOfFreeBytes.lowpart

+ 2 ^ 32) ‘計算

Dms = Dms + CStr(tempb) + “字節” + vbCrLf

tempb = Format(tempb / 1024 / 1024 / 1024, “0.00”)

Dms = Dms + tempb + “G” + vbCrLf

‘取得磁盤已用空間

Dms = Dms + “磁盤已用空間:” + vbCrLf

tempc = tempa – tempb

Dms = Dms + CStr(tempc) + “G” + vbCrLf

MsgBox Dms

End Sub

4、CreateDirectory, CreateDirectoryEx

作用:創建一個新目錄

聲明:

Declare Function CreateDirectory& Lib “kernel32” Alias “CreateDirectoryA”

(ByVal lpNewDirectory As String, lpSecurityAttributes As SECURITY_ATTRIBUTES

)

Declare Function CreateDirectoryEx& Lib “kernel32” Alias “CreateDirectoryExA

” (ByVal lpTemplateDirectory As String, ByVal lpNewDirectory As String, lpSecurityAttributes

As SECURITY_ATTRIBUTES)

說明:此函數的返回值類型為Long,非零表示成功,零表示失敗。會設置GetLastError

參數說明:

lpTemplateDirectory String,指定一個模板目錄的名字,從中復制默認屬性(比如

目錄中文件的默認壓縮方式)。如設為vbNullString,則表示不使用模板

lpNewDirectory String,新目錄的名字

lpSecurityAttributes SECURITY_ATTRIBUTES,這個結構定義了目錄的安全特性——

如果操作系統支持的話

示例:

Private Sub Create_Directory()

Dim Security As SECURITY_ATTRIBUTES

‘創建目錄

Ret& = CreateDirectory(“C:\Directory”, Security)

‘若返回0,則失敗。

If Ret& = 0 Then MsgBox “Error : 創建失敗!”, vbCritical + vbOKOnly

End Sub

5、RemoveDirectory

作用:移除一個目錄

聲明:Declare Function RemoveDirectory Lib “kernel32” Alias “RemoveDirectoryA

” (ByVal lpPathName As String) As Long

說明:此函數的返回值類型為Long,非零表示成功,零表示失敗。會設置GetLastError

.

在調用這個函數前,目錄必須為空

參數說明:

lpPathName 為String類型,要刪除的那個目錄的名字

示例:

Private Sub Remove_Directory()

Dim Security As SECURITY_ATTRIBUTES

CreateDirectoryEx “C:\Windows”, “C:\Temp”, Security

‘移除目錄

RemoveDirectory “C:\Temp”

End Sub

6、SetCurrentDirectory

作用:設置當前目錄,與VBA語句ChDir類似。

聲明:Declare Function SetCurrentDirectory Lib “kernel32” Alias “SetCurrentDirectoryA

” (ByVal lpPathName As String) As Long

說明:此函數的返回值類型為Long,非零表示成功,零表示失敗。會設置GetLastError

參數說明:

LpPathName String,新當前目錄的路徑

示例:

SetCurrentDirectory “d:\” ‘設置D:為當前目錄

7、GetSystemDirectory

作用:這個函數能取得Windows系統目錄(System目錄)的完整路徑名。在這個目錄

中,包含了所有必要的系統文件。根據微軟的標準,其他定制控件和一些共享組件也

可放到這個目錄。通常應避免在這個目錄裡創建文件。在網路環境中,往往需要管理

員權限才可對這個目錄進行寫操作

聲明:Declare Function GetSystemDirectory Lib “kernel32” Alias “GetSystemDirectoryA

” (ByVal lpBuffer As String, ByVal nSize As Long) As Long

說明:此函數的返回值類型為Long,裝載到lpBuffer緩沖區的字符數量。如lpBuffer

不夠大,不能容下文件名,則返回要求的緩沖區長度

參數說明:

lpBuffer String,用於裝載系統目錄路徑名的一個字串緩沖區。它應事先初始化成

nSize+1個字符的長度。通常至少要為這個緩沖區分配MAX_PATH個字符的長度

nSize Long,lpBuffer字串的最大長度

示例:

Private Sub Get_SystemDirectory()

Dim sSave As String, Ret As Long

‘創建緩沖區

sSave = Space(255)

‘獲取系統目錄

Ret = GetSystemDirectory(sSave, 255)

‘移除多餘的0

sSave = Left$(sSave, Ret)

‘顯示路徑

MsgBox “系統目錄: ” + sSave

End Sub

[此貼子已經被作者於2007-4-2 19:10:01編輯過]

1、2、3、4、5、6、8、9、10

2007-4-2 18:55:04舉報帖子

★ 參加論壇競賽,賺積分,贏獎勵! ★agstick

等級:版主

威望:6

文章:413

EH幣:1071

積分:60 精華:2

註冊日期:2006年11月20日

行業:IT業

職業:IT技術人員第 2 樓 ※簡訊 ※好友 ※檔案 ※貼子 ※郵件

————————————————————————-

——-

(二)處理文件

下面是windows中提供的對於文件進行操作的API函數及其功能:

CloseHandle 關閉一個內核對象。其中包括文件、文件映射、進程、線程、安全和

同步對象等。

CompareFileTime 根據FILETIME結構的信息,對比兩個文件的時間

CopyFile 復制文件。注意:只能復制文件,而不能復制目錄

CreateFile 這是一個全功能的函數,可打開和創建文件、管道、郵槽、通信服務

、設備以及控制台

DeleteFile 刪除指定文件

FindClose 關閉由FindFirstFile函數創建的一個搜尋句柄

FindFirstFile 根據文件名查找文件

FindNextFile 根據調用FindFirstFile函數時指定的一個文件名查找下一個文件

FlushFileBuffers 針對指定的文件句柄,刷新內部文件緩沖區

GetBinaryType 判斷文件是否可以執行

GetFileAttributes 判斷指定文件的屬性

GetFileInformationByHandle 該函數能夠獲取上面所有函數所能夠獲取的信息,如

大小、屬性等,同時還包括一些其他地方無法獲取的信息,比如:文件卷標、索引和

鏈接信息。

GetFileSize 判斷文件長度

GetFileTime 取得指定文件的時間信息,有三個文件時間:創建時間、最後訪問時

間、最後寫時間。

GetFileType 在給出文件句柄的前提下,判斷文件類型

GetFileVersionInfo 從支持版本標記的一個模塊裡獲取文件版本信息

GetFileVersionInfoSize 針對包含了版本資源的一個文件,判斷容納文件版本信息

需要一個多大的緩沖區

GetFullPathName 獲取文件路徑,該函數獲取文件的完整路徑名。注意:只有當該

文件在當前目錄下,

結果才正確。如果要得到真正的路徑。應該用GetModuleFileName函數。

GetShortPathName 獲取指定文件的短路徑名

GetTempFileName 這個函數包含了一個臨時文件的名字,它可由應用程序使用

GetTempPath 獲取Windows臨時目錄路徑

lclose 關閉指定的文件,請參考CloseHandle函數,了解進一步的情況

lcreat 創建一個文件。如文件已經存在,就會將其縮短成零長度,並將其打開,

以便讀寫

llseek 設置文件中進行讀寫的當前位置。該函數與vba的seek語句類似。

LockFile 在windows中,文件可用共享模式打開——在這種情況下,多個進程可同

時訪問該文件。

利用這個函數,要對文件進行讀寫的一個應用程序可將文件的某一部分鎖定起來

,使其

不能由其他應用程序訪問。這樣便避免了同時讀寫時發生的衝突

LockFileEx 與LockFile相似,只是它提供了更多的功能

lopen 以二進制模式打開指定的文件

lread 將文件中的數據讀入記憶體緩沖區

lwrite 將數據從記憶體緩沖區寫入一個文件

MoveFile, MoveFileEx 移動文件。如dwFlags設為零,則MoveFile完全等價於MoveFileEx

OpenFile 這個函數能執行大量不同的文件操作。和這個函數相比,請優先考慮CreateFile

函數

(它能打開命名管道和控制Unicode文件名,同時不受128個字符的路徑名稱的限

制)

ReadFile 從文件中讀出數據。與lread函數相比,這個函數要明顯靈活的多。該函

數能夠操作

通信設備、管道、套接字以及郵槽

ReadFileEx 與ReadFile相似,只是它只能用於異步讀操作,並包含了一個完整的

回調

SearchPath 查找指定文件

SetEndOfFile 針對一個打開的文件,將當前文件位置設為文件末尾

SetFileAttributes 設置文件屬性

SetFilePointer 在一個文件中設置當前的讀寫位置

SetFileTime 設置文件的創建、訪問及上次修改時間

UnlockFile 解除對一個文件的鎖定

UnlockFileEx 解除對一個文件的鎖定

WriteFile 將數據寫入一個文件。該函數比lwrite函數要靈活的多。也可將這個函

數應用於對

通信設備、管道、套接字以及郵槽的處理

WriteFileEx 與WriteFile類似,只是它只能用於異步寫操作,並包括了一個完整

的回調

文件的壓縮和解壓縮

LZOpenFile 打開壓縮文件以讀取

LZSeek 查找壓縮文件中的一個位置

LZRead 讀一個壓縮文件

LZClose 關閉一個壓縮文件

LZCopy 復制壓縮文件並在處理過程中展開

GetExpandedName 從壓縮文件中返回文件名稱。

下面通過幾個例子來詳細的了解一下其中主要的幾個函數及其用法:

1、CreateFile

作用:這是一個全功能的例程,可打開和創建文件、管道、郵槽、通信服務、設備以

及控制台

聲明:

Declare Function CreateFile Lib “kernel32” Alias “CreateFileA” (ByVal lpFileName

As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes

As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes

As Long, ByVal hTemplateFile As Long) As Long

說明:

此函數的返回值類型為Long,如執行成功,則返回文件句柄。INVALID_HANDLE_VALUE

表示出錯,會設置GetLastError。即使函數成功,但若文件存在,且指定了CREATE_ALWAYS

或 OPEN_ALWAYS,GetLastError也會設為ERROR_ALREADY_EXISTS

打開一個通信端口時(如COM1),無論如何都要設置成 OPEN_EXISTING。

這個函數代替了lOpen 和 lCreate函數,應該是我們的首選

參數說明:

·lpFileName String,要打開的文件的名字

·dwDesiredAccess Long,如果為 GENERIC_READ 表示允許對設備進行讀訪問;如

果為 GENERIC_WRITE 表示允許對設備進行寫訪問(可組合使用);如果為零,表示

只允許獲取與一個設備有關的信息

·dwShareMode Long,零表示不共享; FILE_SHARE_READ 和/或 FILE_SHARE_WRITE

表示允許對文件進行共享訪問

·lpSecurityAttributes SECURITY_ATTRIBUTES,指向一個SECURITY_ATTRIBUTES結

構的指針,定義了文件的安全特性(如果操作系統支持的話)

·dwCreationDisposition

Long,下述常數之一:

CREATE_NEW 創建文件;如文件存在則會出錯

CREATE_ALWAYS 創建文件,會改寫前一個文件

OPEN_EXISTING 文件必須已經存在。由設備提出要求

OPEN_ALWAYS 如文件不存在則創建它

TRUNCATE_EXISTING 講現有文件縮短為零長度

·dwFlagsAndAttributes

Long,一個或多個下述常數

FILE_ATTRIBUTE_ARCHIVE 標記歸檔屬性

FILE_ATTRIBUTE_COMPRESSED 將文件標記為已壓縮,或者標記為文件在目錄中的默

認壓縮方式

FILE_ATTRIBUTE_NORMAL 默認屬性

FILE_ATTRIBUTE_HIDDEN 隱藏文件或目錄

FILE_ATTRIBUTE_READONLY 文件為只讀

FILE_ATTRIBUTE_SYSTEM 文件為系統文件

FILE_FLAG_WRITE_THROUGH 操作系統不得推遲對文件的寫操作

FILE_FLAG_OVERLAPPED 允許對文件進行重疊操作

FILE_FLAG_NO_BUFFERING 禁止對文件進行緩沖處理。文件只能寫入磁盤卷的扇區

FILE_FLAG_RANDOM_ACCESS 針對隨機訪問對文件緩沖進行優化

FILE_FLAG_SEQUENTIAL_SCAN 針對連續訪問對文件緩沖進行優化

FILE_FLAG_DELETE_ON_CLOSE 關閉了上一次打開的句柄後,將文件刪除。特別適合

臨時文件

也可在Windows NT下組合使用下述常數標記:

SECURITY_ANONYMOUS, SECURITY_IDENTIFICATION, SECURITY_IMPERSONATION, SECURITY_DELEGATION

, SECURITY_CONTEXT_TRACKING, SECURITY_EFFECTIVE_ONLY

·hTemplateFile Long,如果不為零,則指定一個文件句柄。新文件將從這個文件

中復制擴展屬性

示例如下:

lngHandle = CreateFile(“c:\text.txt”, GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE

, ByVal 0&, OPEN_ALWAYS, 0, 0)

‘上面代碼以寫方法打開文件,如文件不存在則創建它。

2、lcreat

作用:創建一個文件。如文件已經存在,就會將其縮短成零長度,並將其打開,以便

讀寫

聲明:Declare Function lcreat Lib “kernel32” Alias “_lcreat” (ByVal lpPathName

As String, ByVal iAttribute As Long) As Long

說明:此函數的返回值類型為Long,如執行成功,返回打開文件的句柄。如果出錯,

則返回HFILE_ERROR

該函數會打開已由其他應用程序打開的文件,所以使用它時要小心。win32的CreateFile

函數已取代了這個函數。這個函數與vb的open語句作用相同

參數說明:

lpPathName String,欲創建的文件的名字

iAttribute Long,下述值之一:

0——文件能夠讀寫

1——創建只讀文件

2——創建隱藏文件

3——創建系統文件

示例:

下面的語句打開c:\test.txt文件

lcreat 「c:\test.txt」,0

3、lopen

作用:以二進制模式打開指定的文件

聲明:Declare Function lopen Lib “kernel32” Alias “_lopen” (ByVal lpPathName

As String, ByVal iReadWrite As Long) As Long

說明:此函數的返回值類型為Long,如執行成功,返回打開文件的句柄。HFILE_ERROR

表示出錯。會設置GetLastError

參數說明:

lpPathName String,欲打開文件的名字

iReadWrite Long,訪問模式和共享模式常數的一個組合,如下所示:

1、訪問模式

READ 打開文件,讀取其中的內容

READ_WRITE 打開文件,對其進行讀寫

WRITE 打開文件,在其中寫入內容

2、共享模式(參考OpenFile函數的標誌常數表)

OF_SHARE_COMPAT, OF_SHARE_DENY_NONE, OF_SHARE_DENY_READ, OF_SHARE_DENY_WRITE

, OF_SHARE_EXCLUSIVE

示例:

lopen 「c:\test.txt」,READ

4、GetFileTime

作用:取得指定文件的時間信息

聲明:Declare Function GetFileTime Lib “kernel32” Alias “GetFileTime” (ByVal

hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME,

lpLastWriteTime As FILETIME) As Long

說明:Long,非零表示成功,零表示失敗。會設置GetLastError

如果不需要特定的信息,那麼lpCreationTime,lpLastAccessTime,lpLastWriteTime

都可以設置為零(用ByVal As Long)。這個函數返回的文件時間採用UTC格式

參數說明:

hFile Long,文件的句柄

lpCreationTime FILETIME,用於裝載文件的創建時間

lpLastAccessTime FILETIME,用於裝載文件上一次訪問的時間(FAT文件系統不支

持這一特性)

lpLastWriteTime FILETIME,用於裝載文件上一次修改的時間

示例:

Dim file As Long

Dim CreationTime As FileTime

Dim lastaccesstime As FileTime

Dim lastaccesstime As FileTime

‘定義結構

Private Type FileTime

dwLowDateTime As Long

dwHighDateTime As Long

End Type

str1 = “c:\text.txt”

file = lopen(str1, READ_WRITE) ‘打開文件

temp = GetFileTime(file, CreationTime, lastaccesstime, lastwritetime)’

得到文件相關信息

以上代碼獲取的時間信息是Long型的,還需要時間轉換函數進行轉換,完整的示例見

附件。

5、CopyFile

作用:復制文件。與vb的filecopy命令相似

聲明:Declare Function CopyFile Lib “kernel32” Alias “CopyFileA” (ByVal lpExistingFileName

As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As

Long

說明:Long,非零表示成功,零表示失敗。會設置GetLastError

參數說明:

lpExistingFileName String,源文件名

lpNewFileName String,目標文件名

bFailIfExists Long,如果設為TRUE(非零),那麼一旦目標文件已經存在,則函

數調用會失敗。否則目標文件被改寫

示例:

CopyFile “c:\test1.txt”, “c:\test2.txt”, 1

以上代碼將c:\test1.txt 拷貝到c:\test2.txt,完整的示例見附件。

6、MoveFile, MoveFileEx

作用:移動文件。如dwFlags設為零,則MoveFile完全等價於MoveFileEx

聲明:

Declare Function MoveFile Lib “kernel32” Alias “MoveFileA” (ByVal lpExistingFileName

As String, ByVal lpNewFileName As String)

Declare Function MoveFileEx Lib “kernel32” Alias “MoveFileExA” (ByVal lpExistingFileName

As String, ByVal lpNewFileName As String, ByVal dwFlags As Long)

說明:Long,非零表示成功,零表示失敗。會設置GetLastError

這兩個函數通常不能將文件從一個卷移動到另一個卷。但如設置了MOVEFILE_COPY_ALLOWED

標記,MoveFileEx可以做到這一點.

參數說明:

lpExistingFileName String,欲移動的文件名

lpNewFileName String,新文件名

dwFlags Long,一個或多個下述常數

MOVEFILE_REPLACE_EXISTING 如目標文件存在,則將其替換

MOVEFILE_COPY_ALLOWED 如移動到一個不同的卷,則復制文件並刪除原來的文件

MOVEFILE_DELAY_UNTIL_REBOOT 移動操作在系統下次重新啟動時正式進行。這樣便可

在Windows NT中改換系統文件

示例:

Private Const MOVEFILE_COPY_ALLOWED = &H2

Private Const MOVEFILE_DELAY_UNTIL_REBOOT = &H4

Private Const MOVEFILE_REPLACE_EXISTING = &H1

MoveFile “c:\test.txt”, “d:\test1.txt” ‘移動文件

MoveFileEx “d:\test1.txt”, “c:\test.txt”, MOVEFILE_COPY_ALLOWED ‘再一次

移動

以上代碼做到了文件的移動,兩次移動後,文件不變

7、DeleteFile

作用:刪除指定文件

聲明:Declare Function DeleteFile Lib “kernel32” Alias “DeleteFileA” (ByVal

lpFileName As String) As Long

說明:Long,非零表示成功,零表示失敗。會設置GetLastError

與vba的kill語句相似,在windows 95下使用這個函數要小心——即使文件當前正由

一個應用程序打開,該函數也會將其刪除.

參數說明:

lpFileName String,欲刪除文件的名字

示例:

DeleteFile “c:\test.txt” ‘刪除c:\test.txt文件

完整的示例見附件。

8、ReadFile

作用:從文件中讀出數據。與lread函數相比,這個函數要明顯靈活的多。該函數能

夠操作通信設備、管道、套接字以及郵槽

聲明:Private Declare Function ReadFile Lib “kernel32” Alias “ReadFile” (

ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long,

lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long

說明:Long,非零表示成功,零表示失敗。會設置GetLastError。如啟動的是一次異

步讀操作,則函數會返回零值,並將ERROR_IO_PENDING設置成GetLastError的結果。

如結果不是零值,但讀入的字節數小於nNumberOfBytesToRead參數指定的值,表明早

已抵達了文件的結尾

參數:

hFile —- Long,文件的句柄

lpBuffer — Any,用於保存讀入數據的一個緩沖區

nNumberOfBytesToRead – Long,要讀入的字符數

lpNumberOfBytesRead – Long,從文件中實際讀入的字符數

lpOverlapped — OVERLAPPED,如文件打開時指定了FILE_FLAG_OVERLAPPED,那麼

必須用這個參數引用一個特殊的結構。那個結構定義了一次異步讀取操作。否則,應

將這個參數設為NULL(將函數聲明成ByVal As Long,並傳遞零值)

示例:完整的示例見附件。

9、WriteFile

作用:將數據寫入一個文件。該函數比lwrite函數要靈活的多。也可將這個函數應用

於對通信設備、管道、套接字以及郵槽的處理

聲明:Declare Function WriteFile Lib “kernel32” Alias “WriteFile” (ByVal

hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten

As Long, lpOverlapped As OVERLAPPED) As Long

說明:Long,TRUE(非零)表示成功,否則返回零。會設置GetLastError

參數:

hFile — Long,一個文件的句柄

lpBuffer — Any,要寫入的一個數據緩沖區

nNumberOfBytesToWrite – Long,要寫入數據的字節數量。如寫入零字節,表示什

麼都不寫入,但會更新文件的「上一次修改時間」。針對位於遠程系統的命名管道,

限制在65535個字節以內

lpNumberOfBytesWritten – Long,實際寫入文件的字節數量

lpOverlapped — OVERLAPPED,倘若在指定FILE_FLAG_OVERLAPPED的前提下打開文

件,這個參數就必須引用一個特殊的結構。那個結構定義了一次異步寫操作。否則,

該參數應置為空(將聲明變為ByVal As Long,並傳遞零值)

示例:完整的示例見附件。

10、SHFileOperation

作用:此函數的功能很強大,能對文件或文件夾進行復制、移動、重命名、刪除的全

部操作。

聲明:Declare Function SHFileOperation Lib “shell32.dll” Alias “SHFileOperationA

” (lpFileOp As SHFILEOPSTRUCT) As Long

說明:Long,TRUE(非零)表示成功,否則返回零。

參數:

lpFileOp --SHFILEOPSTRUCT類型,指定文件的操作。

Type SHFILEOPSTRUCT

hwnd As Long

wFunc As Long ‘對文件的操作指令

pFrom As String ‘源文件或路徑

pTo As String ‘目的文件或路徑

fFlags As Integer ‘操作標誌

fAnyOperationsAborted As Long

hNameMappings As Long

lpszProgressTitle As String

End Type

示例:見附件。

(三)總結

通過以上的介紹,我們可以看到API在文件操作方面功能十分強大,能夠完成一些前

面方法所不能完成的任務。FileSystemObject對象模型的內部可能就是用API寫的,

即便不是我們也可以用API寫出一個FSO類來。API是一個巨大的寶庫,當你為做到某

個功能而愁眉不展的時候,查查API可能就能找到滿意的答案。