久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Excel-VBA操作文件四大方法之四(1)

 xiangtui 2010-02-10

四、利用API函數(shù)來(lái)處理文件

通過(guò)前面三種方法的介紹,,你是否已經(jīng)覺得足夠了,?是的,前面的方法完全可以應(yīng)付幾乎所有的文件操作。但是為了普及一下API,展示一下API的魅力,最后向大家介紹一下如何利用API函數(shù)來(lái)處理文件,。另一方面也是本人對(duì)API情有獨(dú)鐘,為她做一下廣告,,呵呵,。

大家對(duì)API的強(qiáng)大也是有所耳聞了,在文件操作方面,,API自然毫不遜色,。
說(shuō)明:為了文章簡(jiǎn)潔,我們先給出API函數(shù)的名稱及功能,,其完整的聲明及常數(shù)就不再一一細(xì)訴,,只在示例中給出其完整用法。

(一)處理驅(qū)動(dòng)器及目錄

下面是windows中提供的對(duì)于目錄進(jìn)行操作的API函數(shù)及其功能:

CreateDirectory,CreateDirectoryEx  創(chuàng)建一個(gè)新目錄
GetCurrentDirectory    在一個(gè)緩沖區(qū)中裝載當(dāng)前目錄
GetDiskFreeSpace,GetDiskFreeSpaceEx  獲取與一個(gè)磁盤的組織有關(guān)的信息,,以及了解剩余空間的容量
GetDriveType   判斷一個(gè)磁盤驅(qū)動(dòng)器的類型
GetFullPathName  獲取指定文件的完整路徑名
GetLogicalDrives  判斷系統(tǒng)中存在哪些邏輯驅(qū)動(dòng)器字母
GetLogicalDriveStrings  獲取一個(gè)字串,,其中包含了當(dāng)前所有邏輯驅(qū)動(dòng)器的根驅(qū)動(dòng)器路徑
GetSystemDirectory  這個(gè)函數(shù)能取得Windows系統(tǒng)目錄(System目錄)的完整路徑名。在這個(gè)目錄中,,包含了所有必要的系統(tǒng)文件,。根據(jù)微軟的標(biāo)準(zhǔn),其他定制控件和一些共享組件也可放到這個(gè)目錄,。通常應(yīng)避免在這個(gè)目錄里創(chuàng)建文件,。在網(wǎng)絡(luò)環(huán)境中,往往需要管理員權(quán)限才可對(duì)這個(gè)目錄進(jìn)行寫操作 
GetTempPath   獲取為臨時(shí)文件指定的路徑
GetVolumeInformation  獲取與一個(gè)磁盤卷有關(guān)的信息
GetWindowsDirectory  這個(gè)函數(shù)能獲取Windows目錄的完整路徑名,。在這個(gè)目錄里,,保存了大多數(shù)windows應(yīng)用程序文件及初始化文件
RemoveDirectory  刪除指定目錄
SetCurrentDirectory  設(shè)置當(dāng)前目錄
SetVolumeLabel   設(shè)置一個(gè)磁盤的卷標(biāo)(Label)

下面通過(guò)幾個(gè)例子來(lái)詳細(xì)的了解一下其中主要的幾個(gè)函數(shù)及其用法:

1、GetLogicalDrives

作用:判斷系統(tǒng)中存在哪些邏輯驅(qū)動(dòng)器字母

聲明:Declare Function GetLogicalDrives Lib "kernel32" Alias "GetLogicalDrives" () As Long

說(shuō)明:此函數(shù)的返回值類型為L(zhǎng)ong,,這個(gè)結(jié)構(gòu)中的二進(jìn)制位標(biāo)志著存在哪些驅(qū)動(dòng)器,。其中,位0設(shè)為1表示驅(qū)動(dòng)器A:存在于系統(tǒng)中,;位1設(shè)為1表示存在B:驅(qū)動(dòng)器;以次類推

示例:
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

上面的示例中,,我們通過(guò)二進(jìn)制運(yùn)算,,將返回值轉(zhuǎn)換成字符,。如果你的機(jī)上有C,D,E,F,G,H這幾個(gè)驅(qū)動(dòng)器,那么LDs的值就是252,,轉(zhuǎn)成二進(jìn)制為11111100,,從右往左,依次代表A,B,C,D,...,,為0的說(shuō)明沒(méi)有此驅(qū)動(dòng)器字母,。大家可以自己試一試。

2,、GetDriveType

作用:判斷一個(gè)磁盤驅(qū)動(dòng)器的類型

聲明:Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long

說(shuō)明:此函數(shù)的返回值類型為L(zhǎng)ong,,如驅(qū)動(dòng)器不能識(shí)別,則返回零,。如指定的目錄不存在,,則返回1。如執(zhí)行成功,,則用下述任何一個(gè)常數(shù)指定驅(qū)動(dòng)器類型:DRIVE_REMOVABLE(表示磁盤可以從驅(qū)動(dòng)器上移走,,通常是軟驅(qū)), DRIVE_FIXED(磁盤不能從驅(qū)動(dòng)器上移走,,通常為本地硬盤),, DRIVE_REMOTE(驅(qū)動(dòng)器是遠(yuǎn)程網(wǎng)絡(luò)驅(qū)動(dòng)器), DRIVE_CDROM(驅(qū)動(dòng)器是CD-ROM驅(qū)動(dòng)器) 或 DRIVE_RAMDISK(驅(qū)動(dòng)器是RAM驅(qū)動(dòng)器)
參數(shù)為String類型,,包含了驅(qū)動(dòng)器根目錄路徑的一個(gè)字串
此函數(shù)的功能與FSO的Drive對(duì)象的DriveType屬性是一樣的,。

示例:
'定義常數(shù)變量

Private Const DRIVE_CDROM = 5       '表示光盤驅(qū)動(dòng)器
Private Const DRIVE_FIXED = 3       '表示硬盤驅(qū)動(dòng)器
Private Const DRIVE_RAMDISK = 6     '表示RAM驅(qū)動(dòng)器
Private Const DRIVE_REMOTE = 4      '表示網(wǎng)絡(luò)驅(qū)動(dòng)器
Private Const DRIVE_REMOVABLE = 2   '表示軟盤驅(qū)動(dòng)器


Private Sub Get_DriveType()
  Dim temp As Long
  temp = GetDriveType("d:\")    '取的d:盤驅(qū)動(dòng)器類型
  Select Case temp
    Case DRIVE_CDROM
      MsgBox "DRIVE_CDROM: 光盤驅(qū)動(dòng)器"
    Case DRIVE_FIXED
      MsgBox "DRIVE_FIXED: 硬盤驅(qū)動(dòng)器"
    Case DRIVE_RAMDISK
      MsgBox "DRIVE_RAMDISK: RAM驅(qū)動(dòng)器"
    Case DRIVE_REMOTE
      MsgBox "DRIVE_REMOTE: 網(wǎng)絡(luò)驅(qū)動(dòng)器"
    Case DRIVE_REMOVABLE
      MsgBox "DRIVE_REMOVABLE: 軟盤驅(qū)動(dòng)器"
  End Select
End Sub

3、GetDiskFreeSpaceEx

作用:獲取與一個(gè)磁盤的組織以及剩余空間容量有關(guān)的信息

聲明: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

說(shuō)明:此函數(shù)的返回值類型為L(zhǎng)ong,,非零表示成功,,零表示失敗。會(huì)設(shè)置GetLastError.

在采用FAT16格式的windows95系統(tǒng)中,,如一個(gè)驅(qū)動(dòng)器(分區(qū))的容量超過(guò)了2GB,,則不應(yīng)使用這個(gè)函數(shù)。此時(shí),,這個(gè)函數(shù)能識(shí)別的最大分區(qū)容量只有2GB

參數(shù)說(shuō)明:
lpRootPathName String,,不包括卷名的磁盤根路徑名
lpFreeBytesAvailableToCaller LARGE_INTEGER,指定一個(gè)變量,,用于容納調(diào)用者可用的字節(jié)數(shù)量
lpTotalNumberOfBytes LARGE_INTEGER,,指定一個(gè)變量,用于容納磁盤上的總字節(jié)數(shù)
lpTotalNumberOfFreeBytes LARGE_INTEGER,,指定一個(gè)變量,,用于容納磁盤上可用的字節(jié)數(shù)

LARGE_INTEGER結(jié)構(gòu)用來(lái)代表一個(gè)64位帶符號(hào)的整數(shù)值,它的定義如下:

Type LARGE_INTEGER ' 8 Bytes
 lowpart As Long
 highpart As Long
End Type

其中l(wèi)owpart為 Long,,指定低32位,highpart 為 Long,,指定高32位,。

示例:雖然此函數(shù)能識(shí)別的最大分區(qū)容量只有2GB,但通過(guò)調(diào)整,,對(duì)大于2G的仍然能得出正確容量,。以下的調(diào)整公式是本人通過(guò)逆向推算出來(lái)的,至于其中的原理也不是很清楚,,大家可一測(cè)試一下,。

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) '計(jì)算容量
  Dms = Dms + CStr(tempa) + "字節(jié)" + 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) '計(jì)算
  Dms = Dms + CStr(tempb) + "字節(jié)" + 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

作用:創(chuàng)建一個(gè)新目錄

聲明:
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)

說(shuō)明:此函數(shù)的返回值類型為L(zhǎng)ong,,非零表示成功,,零表示失敗。會(huì)設(shè)置GetLastError

參數(shù)說(shuō)明:
lpTemplateDirectory String,,指定一個(gè)模板目錄的名字,,從中復(fù)制默認(rèn)屬性(比如目錄中文件的默認(rèn)壓縮方式)。如設(shè)為vbNullString,,則表示不使用模板
lpNewDirectory String,,新目錄的名字
lpSecurityAttributes SECURITY_ATTRIBUTES,這個(gè)結(jié)構(gòu)定義了目錄的安全特性——如果操作系統(tǒng)支持的話

示例:
Private Sub Create_Directory()
    Dim Security As SECURITY_ATTRIBUTES
    '創(chuàng)建目錄
    Ret& = CreateDirectory("C:\Directory", Security)
    '若返回0,,則失敗,。
    If Ret& = 0 Then MsgBox "Error : 創(chuàng)建失敗!", vbCritical + vbOKOnly
End Sub

5、RemoveDirectory

作用:移除一個(gè)目錄

聲明:Declare Function RemoveDirectory Lib "kernel32" Alias "RemoveDirectoryA" (ByVal lpPathName As String) As Long

說(shuō)明:此函數(shù)的返回值類型為L(zhǎng)ong,,非零表示成功,,零表示失敗。會(huì)設(shè)置GetLastError.
在調(diào)用這個(gè)函數(shù)前,,目錄必須為空

參數(shù)說(shuō)明:
lpPathName 為String類型,,要?jiǎng)h除的那個(gè)目錄的名字

示例:
Private Sub Remove_Directory()
    Dim Security As SECURITY_ATTRIBUTES
    CreateDirectoryEx "C:\Windows", "C:\Temp", Security
    '移除目錄
    RemoveDirectory "C:\Temp"
End Sub

6、SetCurrentDirectory

作用:設(shè)置當(dāng)前目錄,,與VBA語(yǔ)句ChDir類似,。

聲明:Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long

說(shuō)明:此函數(shù)的返回值類型為L(zhǎng)ong,非零表示成功,,零表示失敗,。會(huì)設(shè)置GetLastError

參數(shù)說(shuō)明:
LpPathName String,新當(dāng)前目錄的路徑

示例:
SetCurrentDirectory "d:\"  '設(shè)置D:為當(dāng)前目錄

7,、GetSystemDirectory

作用:這個(gè)函數(shù)能取得Windows系統(tǒng)目錄(System目錄)的完整路徑名,。在這個(gè)目錄中,包含了所有必要的系統(tǒng)文件,。根據(jù)微軟的標(biāo)準(zhǔn),,其他定制控件和一些共享組件也可放到這個(gè)目錄。通常應(yīng)避免在這個(gè)目錄里創(chuàng)建文件,。在網(wǎng)絡(luò)環(huán)境中,,往往需要管理員權(quán)限才可對(duì)這個(gè)目錄進(jìn)行寫操作

聲明:Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

說(shuō)明:此函數(shù)的返回值類型為L(zhǎng)ong,,裝載到lpBuffer緩沖區(qū)的字符數(shù)量。如lpBuffer不夠大,,不能容下文件名,則返回要求的緩沖區(qū)長(zhǎng)度

參數(shù)說(shuō)明:
lpBuffer String,,用于裝載系統(tǒng)目錄路徑名的一個(gè)字串緩沖區(qū),。它應(yīng)事先初始化成nSize+1個(gè)字符的長(zhǎng)度。通常至少要為這個(gè)緩沖區(qū)分配MAX_PATH個(gè)字符的長(zhǎng)度
nSize Long,,lpBuffer字串的最大長(zhǎng)度

示例:
Private Sub Get_SystemDirectory()
    Dim sSave As String, Ret As Long
    '創(chuàng)建緩沖區(qū)
    sSave = Space(255)
    '獲取系統(tǒng)目錄
    Ret = GetSystemDirectory(sSave, 255)
    '移除多余的0
    sSave = Left$(sSave, Ret)
    '顯示路徑
    MsgBox "系統(tǒng)目錄: " + sSave
End Sub
 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多