国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
Excel-VBA操作文件四大方法之四(1)

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

通過(guò)前面三種方法的介紹,你是否已經(jīng)覺(jué)得足夠了?是的,前面的方法完全可以應(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è)磁盤(pán)的組織有關(guān)的信息,以及了解剩余空間的容量
GetDriveType   判斷一個(gè)磁盤(pán)驅(qū)動(dòng)器的類(lèi)型
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)行寫(xiě)操作 
GetTempPath   獲取為臨時(shí)文件指定的路徑
GetVolumeInformation  獲取與一個(gè)磁盤(pán)卷有關(guān)的信息
GetWindowsDirectory  這個(gè)函數(shù)能獲取Windows目錄的完整路徑名。在這個(gè)目錄里,保存了大多數(shù)windows應(yīng)用程序文件及初始化文件
RemoveDirectory  刪除指定目錄
SetCurrentDirectory  設(shè)置當(dāng)前目錄
SetVolumeLabel   設(shè)置一個(gè)磁盤(pán)的卷標(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èi)型為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)器;以次類(lèi)推

示例:
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è)磁盤(pán)驅(qū)動(dòng)器的類(lèi)型

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

說(shuō)明:此函數(shù)的返回值類(lèi)型為L(zhǎng)ong,如驅(qū)動(dòng)器不能識(shí)別,則返回零。如指定的目錄不存在,則返回1。如執(zhí)行成功,則用下述任何一個(gè)常數(shù)指定驅(qū)動(dòng)器類(lèi)型:DRIVE_REMOVABLE(表示磁盤(pán)可以從驅(qū)動(dòng)器上移走,通常是軟驅(qū)), DRIVE_FIXED(磁盤(pán)不能從驅(qū)動(dòng)器上移走,通常為本地硬盤(pán)), 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類(lèi)型,包含了驅(qū)動(dòng)器根目錄路徑的一個(gè)字串
此函數(shù)的功能與FSO的Drive對(duì)象的DriveType屬性是一樣的。

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

Private Const DRIVE_CDROM = 5       '表示光盤(pán)驅(qū)動(dòng)器
Private Const DRIVE_FIXED = 3       '表示硬盤(pán)驅(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   '表示軟盤(pán)驅(qū)動(dòng)器


Private Sub Get_DriveType()
  Dim temp As Long
  temp = GetDriveType("d:\")    '取的d:盤(pán)驅(qū)動(dòng)器類(lèi)型
  Select Case temp
    Case DRIVE_CDROM
      MsgBox "DRIVE_CDROM: 光盤(pán)驅(qū)動(dòng)器"
    Case DRIVE_FIXED
      MsgBox "DRIVE_FIXED: 硬盤(pán)驅(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: 軟盤(pán)驅(qū)動(dòng)器"
  End Select
End Sub

3、GetDiskFreeSpaceEx

作用:獲取與一個(gè)磁盤(pán)的組織以及剩余空間容量有關(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èi)型為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,不包括卷名的磁盤(pán)根路徑名
lpFreeBytesAvailableToCaller LARGE_INTEGER,指定一個(gè)變量,用于容納調(diào)用者可用的字節(jié)數(shù)量
lpTotalNumberOfBytes LARGE_INTEGER,指定一個(gè)變量,用于容納磁盤(pán)上的總字節(jié)數(shù)
lpTotalNumberOfFreeBytes LARGE_INTEGER,指定一個(gè)變量,用于容納磁盤(pán)上可用的字節(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:"
'取得磁盤(pán)空間
  temp = GetDiskFreeSpaceEx(RootPathName, FreeBytesAvailabletoCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes)

  Dms = Dms + "磁盤(pán)容量:" + 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

'取得磁盤(pán)可用空間

  Dms = Dms + "磁盤(pán)可用空間:" + 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

'取得磁盤(pán)已用空間

  Dms = Dms + "磁盤(pán)已用空間:" + 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èi)型為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èi)型為L(zhǎng)ong,非零表示成功,零表示失敗。會(huì)設(shè)置GetLastError.
在調(diào)用這個(gè)函數(shù)前,目錄必須為空

參數(shù)說(shuō)明:
lpPathName 為String類(lèi)型,要?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類(lèi)似。

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

說(shuō)明:此函數(shù)的返回值類(lèi)型為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)行寫(xiě)操作

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

說(shuō)明:此函數(shù)的返回值類(lèi)型為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
 
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Windows SHELL命令在VBA使用
★Excel-VBA操作文件四大方法[ExcelHome技術(shù)論壇]
談vb目錄文件操作的三種方法
VBA實(shí)用小程序58: 判斷文件是否存在
【煙花原創(chuàng)】VBA零基礎(chǔ)之第197篇VBA之文件與文件夾(六)
123.自動(dòng)映射網(wǎng)絡(luò)驅(qū)動(dòng)器
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服