內容

名稱

Win32API::File - 對檔案/目錄進行 Win32 系統 API 呼叫的低階存取。

語法

use Win32API::File 0.08 qw( :ALL );

MoveFile( $Source, $Destination )
  or  die "Can't move $Source to $Destination: ",fileLastError(),"\n";
MoveFileEx( $Source, $Destination, MOVEFILE_REPLACE_EXISTING() )
  or  die "Can't move $Source to $Destination: ",fileLastError(),"\n";
[...]

說明

提供對處理檔案和目錄的 Win32 系統 API 呼叫的相當低階存取。

若要傳入 NULL 作為選用緩衝區的指標,請傳入空的清單參考,[]

除了對 API 呼叫和相關常數的原始存取外,此模組還處理智慧型緩衝區配置和回傳碼轉換。

除非另有註明,否則所有函式在成功時會回傳 true 值,在失敗時會回傳 false 值,並在失敗時設定 $^E

物件導向/繫結處理介面

警告:這是新程式碼,請自行承擔風險使用。

此版本的 Win32API::File 可用於類似 IO::File 物件的方式

my $file = Win32API::File->new("+> foo");
binmode $file;
print $file "hello there\n";
seek $file, 0, 0;
my $line = <$file>;
$file->close;

它也支援透過 win32 處理 (例如,來自 createFile()) 繫結

tie FILE, 'Win32API::File', $win32_handle;
print FILE "...";

它尚未經過廣泛測試,而且尚未實作緩衝 I/O。

匯出

預設不匯出任何內容。下列標籤可用於匯出大量的符號:":Func"":FuncA"":FuncW"":Misc"":DDD_"":DRIVE_"":FILE_"":FILE_ATTRIBUTE_"":FILE_FLAG_"":FILE_SHARE_"":FILE_TYPE_"":FS_"":FSCTL_"":HANDLE_FLAG_"":IOCTL_STORAGE_"":IOCTL_DISK_"":GENERIC_"":MEDIA_TYPE"":MOVEFILE_"":SECURITY_"":SEM_"":PARTITION_"

":Func"

基本函數名稱:attrLetsToBitscreateFilefileConstantfileLastErrorgetLogicalDrivessetFilePointergetFileSizeCloseHandleCopyFileCreateFileDefineDosDeviceDeleteFileDeviceIoControlFdGetOsFHandleGetDriveTypeGetFileAttributesGetFileSizeGetFileTypeGetHandleInformationGetLogicalDrivesGetLogicalDriveStringsGetOsFHandleGetOverlappedResultGetVolumeInformationIsContainerPartitionIsRecognizedPartitionMoveFileMoveFileExOsFHandleOpenOsFHandleOpenFdQueryDosDeviceReadFileSetErrorModeSetFilePointerSetHandleInformationWriteFile

attrLetsToBits
$uBits= attrLetsToBits( $sAttributeLetters )

將檔案屬性字母字串轉換為設定對應位元的無符號值。$sAttributeLetters 應包含 "achorst" 中的零個或多個字母

"a"

FILE_ATTRIBUTE_ARCHIVE

"c"

FILE_ATTRIBUTE_COMPRESSED

"h"

FILE_ATTRIBUTE_HIDDEN

"o"

FILE_ATTRIBUTE_OFFLINE

"r"

FILE_ATTRIBUTE_READONLY

"s"

FILE_ATTRIBUTE_SYSTEM

"t"

FILE_ATTRIBUTE_TEMPORARY

createFile
$hObject= createFile( $sPath )
$hObject= createFile( $sPath, $rvhvOptions )
$hObject= createFile( $sPath, $svAccess )
$hObject= createFile( $sPath, $svAccess, $rvhvOptions )
$hObject= createFile( $sPath, $svAccess, $svShare )
$hObject= createFile( $sPath, $svAccess, $svShare, $rvhvOptions )

這是一個 Perl 友善的包裝器,用於 CreateFile

如果失敗,$hObject 會設為 false 值,而 regLastError()$^E 會設為失敗原因。否則,$hObject 會設為 Win32 原生檔案句柄,它永遠都是 true 值 [在句柄值為 0 的不可能 (?) 情況下,會傳回 "0 but true"]。

$sPath 是要開啟的檔案 [或裝置等] 路徑。有關 $sPath 可能特殊值的更多資訊,請參閱 CreateFile

$svAccess 可以是包含位元遮罩的數字,用於表示您對檔案所需要的特定存取類型。有關這些值的詳細資料,請參閱 CreateFile$uAccess 參數。

更可能的是,$svAccess 是描述您需要的通用存取類型以及可能使用的檔案建立選項的字串。在此情況下,$svAccess 應包含來自 "qrw" [所需的存取] 的零個或多個字元,來自 "ktn""ce" 的各一個或零個字元,以及空白。這些字母分別代表「查詢存取」、「讀取存取」、「寫入存取」、「如果存在則保留」、「如果存在則截斷」、「僅限新檔案」、「如果不存在則建立」和「僅限現有檔案」。不區分大小寫。

您可以傳入 "?"$svAccess,以顯示錯誤訊息,摘要說明其可能的值。在使用 Perl 除錯程式進行即時程式設計時,這非常方便。

    Win32API::File::createFile:  $svAccess can use the following:
	One or more of the following:
	    q -- Query access (same as 0)
	    r -- Read access (GENERIC_READ)
	    w -- Write access (GENERIC_WRITE)
	At most one of the following:
	    k -- Keep if exists
	    t -- Truncate if exists
	    n -- New file only (fail if file already exists)
	At most one of the following:
	    c -- Create if doesn't exist
	    e -- Existing file only (fail if doesn't exist)
      ''   is the same as 'q  k e'
      'r'  is the same as 'r  k e'
      'w'  is the same as 'w  t c'
      'rw' is the same as 'rw k c'
      'rt' or 'rn' implies 'c'.
      Or $access can be numeric.

$svAccess 的設計目的是「執行我的意思」,因此除非您有興趣了解複雜的細節,否則您可以略過其餘的說明。請注意,如果您想要對裝置進行寫入存取,您需要指定 "k" [以及可能是 "e",例如 "w ke""rw ke"],因為 Win32 建議在開啟裝置時使用 OPEN_EXISTING

"q"

代表「查詢存取」。這實際上並未執行任何操作,因為您在開啟檔案時始終具有查詢存取。您可以指定 "q" 來記錄您打算查詢檔案 [或裝置等]。當您不想要讀取或寫入存取時,這特別有幫助,因為像 "q""q ke" 之類的東西可能比僅 """ke" 更容易理解。

"r"

代表「讀取存取」。在傳遞給 CreateFile$uAccess 中設定 GENERIC_READ 位元。如果 $svAccess 參數遺失 [或如果它為 undef$rvhvOptions 未指定 "Access" 選項],則這是預設存取。

"w"

代表「寫入存取」。在傳遞給 CreateFile$uAccess 中設定 GENERIC_WRITE 位元。

"k"

代表「如果存在,則保留」。如果請求的檔案存在,則會開啟它。這是預設值,除非已請求 GENERIC_WRITE 存取但未請求 GENERIC_READ 存取。與 "t""n" 相反。

"t"

代表「如果存在,則截斷」。如果請求的檔案存在,則會將它截斷為長度為零,然後開啟它。如果已請求 GENERIC_WRITE 存取但未請求 GENERIC_READ 存取,則這是預設值。與 "k""n" 相反。

"n"

代表「僅限新檔案」。如果請求的檔案存在,則不會開啟它,且 createFile 呼叫會失敗。與 "k""t" 相反。無法與 "e" 搭配使用。

"c"

代表「如果沒有,則建立」。如果請求的檔案不存在,則會建立它,然後開啟它。如果已請求 GENERIC_WRITE 存取,或已指定 "t""n",則這是預設值。與 "e" 相反。

"e"

代表「僅限現有檔案」。如果請求的檔案不存在,則不會開啟任何檔案,且 createFile 呼叫會失敗。這是預設值,除非已請求 GENERIC_WRITE 存取,或已指定 "t""n"。與 "c" 相反。無法與 "n" 搭配使用。

"ktn""ce" 中的字元組合,以決定傳遞給 CreateFile$uCreate 值 [除非已由 $rvhvOptions 覆寫]

"kc"

OPEN_ALWAYS

"ke"

OPEN_EXISTING

"tc"

TRUNCATE_EXISTING

"te"

CREATE_ALWAYS

"nc"

CREATE_NEW

"ne"

不合法。

$svShare 控制檔案的共用方式,也就是在我們開啟檔案時,其他處理程序是否可以對檔案有讀取、寫入和/或刪除存取權。$svShare 通常會是包含 "rwd" 中零個或多個字元的字串,但也可以是數字位元遮罩。

"r" 設定 FILE_SHARE_READ 位元,允許其他處理程序對檔案有讀取存取權。"w" 設定 FILE_SHARE_WRITE 位元,允許其他處理程序對檔案有寫入存取權。"d" 設定 FILE_SHARE_DELETE 位元,允許其他處理程序對檔案有刪除存取權 [在 Windows 95 中會忽略]。

$svShare 的預設值為 "rw",它提供與使用一般 perl open() 相同的共用。

如果另一個程序目前具有對檔案的讀取、寫入和/或刪除存取權,而您不允許該共用層級,則您對 createFile 的呼叫將會失敗。如果您要求讀取、寫入和/或刪除存取權,而另一個程序已開啟該檔案,但又不允許該共用層級,則您對 createFile 的呼叫將會失敗。一旦您開啟檔案,如果另一個程序嘗試以讀取、寫入和/或刪除存取權開啟它,而您不允許該共用層級,則該程序將無法開啟該檔案。

$rvhvOptions 是對雜湊的參考,其中任何鍵都必須來自清單 qw( Access Create Share Attributes Flags Security Model )。值的意義取決於鍵名稱,如下所述。$rvhvOptions 中的任何選項值都會覆寫 $svAccess$svShare 中的設定(如果它們衝突)。

Flags => $uFlags

$uFlags 是未簽署的值,其中設定了任何 FILE_FLAG_*FILE_ATTRIBUTE_* 位元。透過 Attributes 選項設定的任何 FILE_ATTRIBUTE_* 位元都會以邏輯 or 與這些位元相連。預設為 0

如果開啟命名管道的用戶端端,則您也可以指定 SECURITY_SQOS_PRESENT 以及其他 SECURITY_* 常數之一,以指定要使用的安全性服務品質。

Attributes => $sAttributes

一個由 "achorst" 組成的零個或多個字元字串 [更多資訊請參閱 attrLetsToBits],轉換為要設定在傳遞給 CreateFile$uFlags 參數中的 FILE_ATTRIBUTE_* 位元。

安全性 => $pSecurityAttributes

$pSecurityAttributes 應包含封裝在字串或 [] [預設值] 中的 SECURITY_ATTRIBUTES 結構。

範本 => $hModelFile

$hModelFile 應包含使用 GENERIC_READ 存取權限開啟的,用於複製檔案屬性和延伸屬性的範本檔案的控制代碼。或者,$hModelFile 可以為 0 [預設值]。

存取 => $sAccess
存取 => $uAccess

$sAccess 應為由 "qrw" 組成的零個或多個字元的字串,指定所需的存取類型:「查詢」或 0、「讀取」或 GENERIC_READ [預設值],或「寫入」或 GENERIC_WRITE

$uAccess 應為包含設定位元以指示所需存取類型的無符號值。GENERIC_READ 為預設值。

建立 => $sCreate
建立 => $uCreate

$sCreate 應為包含由 "ktn" 組成的零個或一個字元,以及由 "ce" 組成的零個或一個字元的字串。這些代表「如果存在則保留」、「如果存在則截斷」、「僅限新檔案」、「如果不存在則建立」和「僅限現有檔案」。這些會轉譯成 $uCreate 值。

$uCreate 應為 OPEN_ALWAYSOPEN_EXISTINGTRUNCATE_EXISTINGCREATE_ALWAYSCREATE_NEW 之一。

共用 => $sShare
共用 => $uShare

$sShare 應為一個字串,包含 "rwd" 中的零個或多個字元,並轉譯為 $uShare 值。"rw" 為預設值。

$uShare 應為具有設定下列零個或多個位元的無符號值:FILE_SHARE_READFILE_SHARE_WRITEFILE_SHARE_DELETEFILE_SHARE_READ|FILE_SHARE_WRITE 為預設值。

範例

$hFlop= createFile( "//./A:", "r", "r" )
  or  die "Can't prevent others from writing to floppy: $^E\n";
$hDisk= createFile( "//./C:", "rw ke", "" )
  or  die "Can't get exclusive access to C: $^E\n";
$hDisk= createFile( $sFilePath, "ke",
  { Access=>FILE_READ_ATTRIBUTES } )
  or  die "Can't read attributes of $sFilePath: $^E\n";
$hTemp= createFile( "$ENV{Temp}/temp.$$", "wn", "",
  { Attributes=>"hst", Flags=>FILE_FLAG_DELETE_ON_CLOSE() } )
  or  die "Can't create temporary file, temp.$$: $^E\n";
getLogicalDrives
@roots= getLogicalDrives()

傳回當前定義的所有邏輯磁碟機的根目錄路徑。這包括所有類型的磁碟機代號,例如磁碟片、CD-ROM、硬碟和網路分享。在設備不佳的電腦上,典型的傳回值會是 ("A:\\","C:\\")

CloseHandle
CloseHandle( $hObject )

關閉 Win32 原生處理,例如透過 CreateFile 開啟的處理。與大多數常式一樣,如果成功會傳回真值,如果失敗會傳回假值 [並設定 $^EregLastError()]。

CopyFile
CopyFile( $sOldFileName, $sNewFileName, $bFailIfExists )

$sOldFileName 是要複製檔案的路徑。$sNewFileName 是要複製檔案的目的地路徑。請注意,您無法只在 $sNewFileName 中指定目錄路徑,並使用相同檔案名稱將檔案複製到該目錄。

如果 $bFailIfExists 為真,且 $sNewFileName 是已存在檔案的路徑,則 CopyFile 會失敗。如果 $bFailIfExists 為假,則 $sOldFileNmae 檔案的副本會覆寫已存在的 $sNewFileName 檔案。

與大多數常式一樣,如果成功會傳回真值,如果失敗會傳回假值 [並設定 $^EregLastError()]。

CreateFile
$hObject= CreateFile( $sPath, $uAccess, $uShare, $pSecAttr, $uCreate, $uFlags, $hModel )

如果失敗,$hObject 會設定為 false 值,而 $^EfileLastError() 會設定為失敗原因。否則,$hObject 會設定為 Win32 原生檔案控制代碼,它永遠是 true 值 [在控制代碼具有 0 值的不可能 (?) 的情況下傳回 "0 但為 true"]。

$sPath 是要開啟的檔案 [或裝置等] 的路徑。

$sPath 可以使用 "/""\\" 作為路徑分隔符,甚至可以混合使用這兩個分隔符。我們通常只會在範例中使用 "/",因為使用 "\\" 通常較難閱讀。

在 Windows NT 中,$sPath 可以以 "//?/" 開頭,以允許使用長度超過 MAX_PATH 的路徑 [對於 UNC 路徑,請將開頭的 "//" 取代為 "//?/UNC/",例如 "//?/UNC/Server/Share/Dir/File.Ext"]。

$sPath 可以以 "//./" 開頭,以表示路徑的其餘部分是「DOS 裝置」的名稱。您可以使用 QueryDosDevice 列出所有目前的 DOS 裝置,並可以使用 DefineDosDevice 新增或刪除這些裝置。如果您從 CPAN 取得此模組的原始碼發行版,則它包含範例指令碼 ex/ListDevs.plx,它會列出所有目前的 DOS 裝置及其「原生」定義。再次注意,這在 Win95 或 Win98 中無法使用。

最常見的此類 DOS 裝置包括

"//./PhysicalDrive0"

您的整個第一個硬碟。在 Windows 95 中無法使用。這允許您讀取或寫入硬碟的原始扇區,並使用 DeviceIoControl 對硬碟執行雜項查詢和作業。寫入原始扇區和某些其他作業可能會嚴重損壞您的檔案或電腦的功能。

鎖定此裝置以取得獨佔存取權 [透過為 $uShare 指定 0] 不會阻止存取磁碟上的分割區或其檔案系統。因此,其他處理程序仍然可以存取分割區內的任何原始扇區,並可以照常使用磁碟上的檔案系統。

"//./C:"

您的 C: 磁碟分割區。在 Windows 95 中無法使用。這讓您可以讀取或寫入該分割區的原始磁區,並使用 DeviceIoControl 對分割區執行不同的查詢和操作。寫入原始磁區和其他某些操作可能會嚴重損壞您的檔案或電腦功能。

鎖定此分割區以取得獨佔存取權並不會阻止存取分割區所在的實體磁碟機,因此其他程序仍然可以使用這種方式存取原始磁區。鎖定此分割區以取得獨佔存取權阻止其他程序開啟相同的原始分割區,也會阻止存取該分割區上的檔案系統。它甚至會阻止目前的程序存取該分割區上的檔案系統。

"//./A:"

原始磁碟片。在 Windows 95 中無法使用。這讓您可以讀取或寫入磁碟片的原始磁區,並使用 DeviceIoControl 對磁碟片或磁碟機執行不同的查詢和操作。

鎖定此分割區以取得獨佔存取權會阻止所有存取磁碟片的動作。

"//./PIPE/PipeName"

一個命名管線,透過 CreateNamedPipe 建立。

$uAccess 是個未簽署的值,其中設定的位元表示所需的存取類型。通常是 0 [「查詢」存取權]、GENERIC_READGENERIC_WRITEGENERIC_READ|GENERIC_WRITEGENERIC_ALL。可以指定更明確的存取類型,例如 FILE_APPEND_DATAFILE_READ_EA

$uShare 控制檔案的共用方式,也就是在我們開啟檔案時,其他程序是否可以讀取、寫入和/或刪除檔案的存取權。$uShare 是未簽署值,其中設定了這些位元組的零個或多個:FILE_SHARE_READFILE_SHARE_WRITEFILE_SHARE_DELETE

如果另一個程序目前有讀取、寫入和/或刪除檔案的存取權,而您不允許這種共用層級,則您對 CreateFile 的呼叫將會失敗。如果您要求讀取、寫入和/或刪除存取權,而另一個程序已經開啟檔案,但又不允許這種共用層級,則您對 createFile 的呼叫將會失敗。一旦您開啟檔案,如果另一個程序嘗試以讀取、寫入和/或刪除存取權來開啟檔案,而您又不允許這種共用層級,則該程序將無法開啟檔案。

$pSecAttr 應該為 [] [對於 NULL] 或封裝在字串中的 SECURITY_ATTRIBUTES 資料結構。例如,如果 $pSecDesc 包含封裝在字串中的 SECURITY_DESCRIPTOR 結構,也許透過

RegGetKeySecurity( $key, 4, $pSecDesc, 1024 );

然後您可以透過設定 $pSecAttr

$pSecAttr= pack( "L P i", 12, $pSecDesc, $bInheritHandle );

$uCreate 是下列值之一:OPEN_ALWAYSOPEN_EXISTINGTRUNCATE_EXISTINGCREATE_ALWAYSCREATE_NEW

$uFlags 是未簽署值,其中設定了零個或多個位元組,表示要與檔案關聯的屬性 [FILE_ATTRIBUTE_* 值] 或特殊選項 [FILE_FLAG_* 值]。

如果開啟命名管道的用戶端端點,則您也可以設定 $uFlags,以包含 SECURITY_SQOS_PRESENT 以及其他 SECURITY_* 常數之一,以指定要使用的安全性服務品質。

$hModel0 [或 [],兩者都表示 NULL] 或使用 GENERIC_READ 存取權限開啟的 Win32 原生處理序,用於開啟模型檔案,如果建立新檔案,則會從中複製檔案屬性和延伸屬性。

範例

$hFlop= CreateFile( "//./A:", GENERIC_READ(),
  FILE_SHARE_READ(), [], OPEN_EXISTING(), 0, [] )
  or  die "Can't prevent others from writing to floppy: $^E\n";
$hDisk= CreateFile( $sFilePath, FILE_READ_ATTRIBUTES(),
  FILE_SHARE_READ()|FILE_SHARE_WRITE(), [], OPEN_EXISTING(), 0, [] )
  or  die "Can't read attributes of $sFilePath: $^E\n";
$hTemp= CreateFile( "$ENV{Temp}/temp.$$", GENERIC_WRITE(), 0,
  CREATE_NEW(), FILE_FLAG_DELETE_ON_CLOSE()|attrLetsToBits("hst"), [] )
  or  die "Can't create temporary file, temp.$$: $^E\n";
DefineDosDevice
DefineDosDevice( $uFlags, $sDosDeviceName, $sTargetPath )

定義新的 DOS 裝置,覆寫 DOS 裝置的目前定義,或刪除 DOS 裝置的定義。與大多數常式一樣,如果成功會傳回真值,如果失敗會傳回假值 [並設定 $^EregLastError()]。

$sDosDeviceName 是我們想要新增或刪除定義的 DOS 裝置名稱。

$uFlags 是未簽署值,設定下列其中一個或多個位元

DDD_RAW_TARGET_PATH

表示 $sTargetPath 會是原始的 Windows NT 物件名稱。這通常表示 $sTargetPath"\\Device\\" 開頭。請注意,您無法在原始目標路徑名稱中使用 "/" 取代 "\\"

DDD_REMOVE_DEFINITION

要求刪除定義。如果 $sTargetPath[] [表示 NULL],則會移除 $sDosDeviceName 最近新增的定義。否則會移除與 $sTargetPath 相符的最近新增定義。

如果移除最後一個定義,則也會刪除 DOS 裝置名稱。

DDD_EXACT_MATCH_ON_REMOVE

刪除定義時,此位元會導致每個 $sTargetPath 在搜尋最近新增的比對時,與完整長度的定義進行比對。如果未設定此位元,則 $sTargetPath 僅需要與定義的前置詞相符。

$sTargetPath 是您想要新增或刪除的 DOS 裝置特定定義。對於 DDD_RAW_TARGET_PATH,這些通常以 "\\Device\\" 開頭。如果未設定 DDD_RAW_TARGET_PATH 位元,則 $sTargetPath 僅是某個檔案或目錄的普通路徑,提供 subst 指令的功能。

DeleteFile
DeleteFile( $sFileName )

刪除已命名的檔案。與 Perl 的 unlink 相比,DeleteFile 的優點是不會刪除唯讀檔案。對於 某些 Perl 版本,unlink 會在刪除檔案前,無論是否需要,都會靜默呼叫 chmod,因此您已透過標記為唯讀來保護的檔案,並非總是能受到 Perl 的 unlink 保護。

與大多數常式一樣,如果成功會傳回真值,如果失敗會傳回假值 [並設定 $^EregLastError()]。

DeviceIoControl
DeviceIoControl( $hDevice, $uIoControlCode, $pInBuf, $lInBuf, $opOutBuf, $lOutBuf, $olRetBytes, $pOverlapped )

要求對 I/O [輸入/輸出] 裝置執行特殊作業,例如彈出磁帶或格式化磁碟。與大多數常式一樣,如果成功則傳回 true 值,如果失敗則傳回 false 值 [並設定 $^EregLastError()]。

$hDevice 是裝置的 Win32 原生檔案控制代碼 [CreateFile 的傳回值]。

$uIoControlCode 是一個未簽署的值 [一個 IOCTL_*FSCTL_* 常數],表示要執行的查詢類型或其他操作。

$pInBuf[] [對於 NULL] 或打包成字串的資料結構。資料結構的類型取決於 $uIoControlCode 值。$lInBuf0$pInBuf 中結構的長度。如果 $pInBuf 不是 []$lInBuf0,則會自動將 $lInBuf 設為 length($pInBuf)

$opOutBuf[] [對於 NULL] 或將設為包含打包成字串的已傳回資料結構。$lOutBuf 表示在 $opOutBuf 中要配置多少空間,供 DeviceIoControl 儲存資料結構。如果 $lOutBuf 是數字且 $opOutBuf 已為其配置一個大於 $lOutBuf 位元的緩衝區,則會將這個較大的緩衝區大小傳遞給 DeviceIoControl。不過,您可以透過在 $lOutBuf 前面加上 "=" 來強制傳遞特定緩衝區大小給 DeviceIoControl

$olRetBytes[] 或是一個標量,用於接收寫入 $opOutBuf 的位元組數。即使 $olRetBytes[],也會將一個指向 DWORD [而不是 NULL] 的有效指標傳遞給 DeviceIoControl。在此情況下,[] 僅表示您不關心可能會寫入 $olRetBytes 的值,這通常是情況,因為您通常可以使用 length($opOutBuf) 來代替。

$pOverlapped[] 或打包成字串的 OVERLAPPED 結構。這僅在使用 FILE_FLAG_OVERLAPPED 旗標開啟 $hDevice 時才有用。

FdGetOsFHandle
$hNativeHandle= FdGetOsFHandle( $ivFd )

FdGetOsFHandle 只會呼叫 _get_osfhandle()。它已重新命名,以便更符合此模組的其他函式名稱,特別是為了與 GetOsFHandle 區分。它會取得一個整數檔案描述符 [來自 Perl 的 fileno],並傳回與該檔案描述符關聯的 Win32 原生檔案控制代碼,或在 $ivFd 不是開啟的檔案描述符時傳回 INVALID_HANDLE_VALUE

當您呼叫 Perl 的 open 來設定 Perl 檔案控制代碼 [例如 STDOUT] 時,Perl 會呼叫 C 的 fopen 來設定 stdio FILE *。C 的 fopen 會呼叫類似 Unix 的 open,也就是 Win32 的 _sopen,來取得一個整數檔案描述符 [其中 0 代表 STDIN,1 代表 STDOUT,等等]。Win32 的 _sopen 會呼叫 CreateFile 來設定 HANDLE,一個 Win32 原生檔案控制代碼。因此,每個 Perl 檔案控制代碼 [例如 STDOUT] 都有一個整數檔案描述符與之關聯,您可以透過 fileno 取得。此外,在 Win32 下,每個檔案描述符都有一個 Win32 原生檔案控制代碼與之關聯。FdGetOsFHandle 讓您可以取得對它的存取權。

如果 FdGetOsFHandle 失敗,$hNativeHandle 會設定為 INVALID_HANDLE_VALUE [且 lastFileError()$^E 會設定]。另請參閱 GetOsFHandle,它提供一個更友善的介面。

fileConstant
$value= fileConstant( $sConstantName )

擷取常數的值。如果 $sConstantName 不是此模組支援的常數名稱,則傳回 undef。絕不會設定 $!$^E

這個函式很少使用,因為您通常會透過在 use Win32API::File 陳述式中列出常數名稱,將該常數匯入您的套件來取得常數的值,然後在您的程式碼中使用常數名稱 [可能後面接著 ()]。這個函式對於驗證 Perl 程式碼中不存在的常數名稱很有用,例如,在提示使用者輸入常數名稱後。

fileLastError
$svError= fileLastError();
fileLastError( $uError );

傳回此模組中常式所遭遇的最後一個錯誤。它就像 $^E 一樣,但只有此模組中的常式會變更它。理想上,你只要使用 $^E 即可,但目前版本的 Perl 經常在你來得及檢查之前就覆寫 $^E,而非常舊版本的 Perl 在 Win32 下並不支援 $^E

就像 $^E 一樣,在數字脈絡中,fileLastError() 傳回數字錯誤值,而在字串脈絡中,它傳回錯誤的文字說明 [它實際上傳回一個包含兩個值的 Perl 純量,因此 $x= fileLastError() 會導致 $x 在字串與數字脈絡中傳回不同的值]。

最後一個形式設定未來呼叫 fileLastError() 所傳回的錯誤,不應經常使用。$uError 必須是數字錯誤碼。也會傳回 $uError 的雙重值版本。

GetDriveType
$uDriveType= GetDriveType( $sRootPath )

取得一個字串,提供檔案系統根目錄的路徑 [稱為「磁碟機」,因為每個檔案系統都指定一個「磁碟機代號」],並傳回一個未簽名的值,指出檔案系統所在的磁碟機類型。傳回值應為下列之一

DRIVE_UNKNOWN

以下皆非。

DRIVE_NO_ROOT_DIR

沒有檔案系統的「磁碟機」。這可能是尚未定義的磁碟機代號,或是指定給尚未格式化的分割區的磁碟機代號。

DRIVE_REMOVABLE

軟碟機或其他可移除媒體磁碟機,但不是 CD-ROM 磁碟機。

DRIVE_FIXED

一般的硬碟分割區。

DRIVE_REMOTE

網路分享。

DRIVE_CDROM

光碟機。

DRIVE_RAMDISK

「ram 磁碟」或記憶體駐留虛擬檔案系統,用於高速存取少量暫存檔案空間。

GetFileAttributes
$uAttrs = GetFileAttributes( $sPath )

取得路徑字串並傳回具有屬性旗標的未簽署值。如果失敗,則傳回 INVALID_FILE_ATTRIBUTES,否則可以是下列值中的一個或多個

FILE_ATTRIBUTE_ARCHIVE

檔案或目錄是封存檔案或目錄。應用程式使用這個屬性來標記要備份或移除的檔案。

FILE_ATTRIBUTE_COMPRESSED

檔案或目錄已壓縮。對於檔案,這表示檔案中的所有資料都已壓縮。對於目錄,這表示壓縮是新建立的檔案和子目錄的預設值。

FILE_ATTRIBUTE_DEVICE

保留;請勿使用。

FILE_ATTRIBUTE_DIRECTORY

控制碼識別目錄。

FILE_ATTRIBUTE_ENCRYPTED

檔案或目錄已加密。對於檔案,這表示檔案中的所有資料串流都已加密。對於目錄,這表示加密是新建立的檔案和子目錄的預設值。

FILE_ATTRIBUTE_HIDDEN

檔案或目錄已隱藏。它不會包含在一般目錄清單中。

FILE_ATTRIBUTE_NORMAL

檔案或目錄沒有設定其他屬性。此屬性僅在單獨使用時才有效。

FILE_ATTRIBUTE_NOT_CONTENT_INDEXED

檔案不會由內容索引服務索引。

FILE_ATTRIBUTE_OFFLINE

檔案的資料無法立即取得。此屬性表示檔案資料已實體移至離線儲存。此屬性由遠端儲存 (階層式儲存管理軟體) 使用。應用程式不應任意變更此屬性。

FILE_ATTRIBUTE_READONLY

檔案或目錄為唯讀。應用程式可以讀取檔案,但無法寫入或刪除檔案。如果是目錄,應用程式無法刪除它。

FILE_ATTRIBUTE_REPARSE_POINT

檔案或目錄有相關的重新分析點。

FILE_ATTRIBUTE_SPARSE_FILE

檔案為稀疏檔案。

FILE_ATTRIBUTE_SYSTEM

檔案或目錄是作業系統的一部分,或專門由作業系統使用。

FILE_ATTRIBUTE_TEMPORARY

檔案用於暫時儲存。如果快取記憶體足夠,檔案系統會避免將資料寫回大量儲存,因為應用程式通常會在關閉控制代碼後立即刪除暫存檔。在這種情況下,系統可以完全避免寫入資料。否則,資料會在關閉控制代碼後寫入。

GetFileType
$uFileType= GetFileType( $hFile )

取得 Win32 原生檔案控制代碼,並傳回一個 FILE_TYPE_* 常數,表示在該控制代碼上開啟的檔案類型

FILE_TYPE_UNKNOWN

下列皆非。通常是特殊裝置。

FILE_TYPE_DISK

一般磁碟檔案。

FILE_TYPE_CHAR

Unix 所謂的「特殊字元檔案」,亦即在字元串流上運作的裝置,例如印表機埠或主控台。

FILE_TYPE_PIPE

命名或匿名管線。

getFileSize
$size= getFileSize( $hFile )

這是 GetFileSize (如下) API 呼叫的 Perl 友善包裝函式。

它取得 Win32 原生檔案控制代碼,並傳回以位元組為單位的檔案大小。由於大小可能是 64 位元值,因此在非 64 位元整數 Perl 中,傳回的值將是 Math::BigInt 型別的物件。

GetFileSize
$iSizeLow= GetFileSize($win32Handle, $iSizeHigh)

傳回由 $win32Handle 指向的檔案大小,如果 $iSizeHigh 不為 [],則選擇性地將高階 32 位元儲存在 $iSizeHigh 中。如果 $iSizeHigh[],則非零值表示成功。否則,如果失敗,傳回值將為 0xffffffff,而 fileLastError() 將不為 NO_ERROR

GetOverlappedResult
$bRetval= GetOverlappedResult( $win32Handle, $pOverlapped, $numBytesTransferred, $bWait )

用於 Win32 中的非同步 IO,以取得掛起的 IO 作業結果,例如當檔案作業傳回 ERROR_IO_PENDING 時。失敗時傳回 false 值。$overlapped 結構和 $numBytesTransferred 會修改為作業的結果。

至於建立 $pOverlapped 結構,目前您必須自行建立。

請參閱 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getoverlappedresult.asp 以取得更多資訊。

GetLogicalDrives
$uDriveBits= GetLogicalDrives()

傳回一個未簽署的值,其中每個目前定義的磁碟機代號設定一個位元。如果「A:」目前是有效的磁碟機代號,則 1 位元會在 $uDriveBits 中設定。如果「B:」有效,則 2 位元會設定。如果「Z:」有效,則 2**26 [0x4000000] 位元會設定。

GetLogicalDriveStrings
$olOutLength= GetLogicalDriveStrings( $lBufSize, $osBuffer )

對於每個目前定義的磁碟機代號,會建立一個以 '\0' 結尾的字串,表示其檔案系統根目錄的路徑。所有這些字串會串接成一個較大的字串,並加上一個額外的終止 '\0'。這個較大的字串會傳回至 $osBuffer。請注意,這包括已定義但沒有檔案系統的磁碟機代號,例如指定給未格式化分割區的磁碟機代號。

$lBufSize 是要配置來儲存這個字串清單的緩衝區大小。26*4+1 永遠足夠,而且通常應該使用。

$osBuffer 是要設定為包含建立字串的純量。

$olOutLength 是實際寫入 $osBuffer 的位元組數,但也可以使用 length($osBuffer) 來判斷。

例如,在設備不佳的電腦上,

GetLogicalDriveStrings( 4*26+1, $osBuffer );

可能會將 $osBuffer 設定為 9 個字元的字串,"A:\\\0C:\\\0\0"

GetHandleInformation
GetHandleInformation( $hObject, $ouFlags )

擷取與 Win32 原生檔案控制代碼或物件控制代碼相關聯的旗標。

$hObject 是開啟的 Win32 原生檔案控制代碼或開啟的 Win32 原生控制代碼,用於其他類型的物件。

$ouFlags 會設定為未設定或設定零個或多個位元 HANDLE_FLAG_INHERITHANDLE_FLAG_PROTECT_FROM_CLOSE 的未簽署值。請參閱 ":HANDLE_FLAG_" 匯出類別,了解這些位元的意義。

GetOsFHandle
$hNativeHandle= GetOsFHandle( FILE )

取得 Perl 檔案控制代碼 [例如 STDIN],並傳回與其相關聯的 Win32 原生檔案控制代碼。請參閱 FdGetOsFHandle,以取得有關 Win32 原生檔案控制代碼的更多資訊。

如果 GetOsFHandle 失敗,$hNativeHandle 會設定為 false 值 [且 lastFileError()$^E 會設定]。在控制代碼值為 0 的不可能 (?) 情況下,GetOsFHandle 會傳回 "0 但為 true"

GetVolumeInformation
GetVolumeInformation( $sRootPath, $osVolName, $lVolName, $ouSerialNum, $ouMaxNameLen, $ouFsFlags, $osFsType, $lFsType )

取得檔案系統磁碟區的資訊,如果成功,傳回 true 值。如果失敗,傳回 false 值,並設定 fileLastError()$^E

$sRootPath 是指定檔案系統根目錄路徑的字串,例如 "C:/"

$osVolName 是要設定為代表磁碟名稱的字串的標量,也稱為檔案系統標籤。$lVolName 是要配置給 $osVolName 緩衝區的位元組數目 [有關更多資訊,請參閱 "緩衝區大小"]。

$ouSerialNum[] [表示 NULL] 或將設定為磁碟序號的數值。

$ouMaxNameLen[] [表示 NULL] 或將設定為檔案系統內檔案名稱或目錄名稱允許的最大長度。

$osFsType 是要設定為代表檔案系統類型的字串的標量,例如 "FAT""NTFS"$lFsType 是要配置給 $osFsType 緩衝區的位元組數目 [有關更多資訊,請參閱 "緩衝區大小"]。

$ouFsFlags[] [表示 NULL] 或將設定為未簽署整數,其中設定的位元表示檔案系統的屬性

FS_CASE_IS_PRESERVED

檔案系統會保留檔案名稱的大小寫 [通常為 true]。也就是說,它不會變更檔案名稱的大小寫,例如強制轉換為大寫或小寫。

FS_CASE_SENSITIVE

檔案系統支援不忽略檔案名稱大小寫的能力 [但可能會忽略您使用的方式的大小寫]。也就是說,檔案系統有能力強制您正確取得檔案名稱的字母大小寫才能開啟它。這對於「NTFS」檔案系統而言為 true,即使檔案名稱中的大小寫通常仍會被忽略。

FS_UNICODE_STORED_ON_DISK

檔案系統會在檔案名稱中保留 Unicode [對於「NTFS」為 true]。

FS_PERSISTENT_ACLS

檔案系統支援在檔案上設定存取控制清單 [對於「NTFS」為 true]。

FS_FILE_COMPRESSION

檔案系統支援逐檔案壓縮 [對於「NTFS」為 true]。

FS_VOL_IS_COMPRESSED

整個檔案系統已壓縮,例如透過「DoubleSpace」。

IsRecognizedPartition
IsRecognizedPartition( $ivPartitionType )

取得分割區類型,並傳回 Win32 是否支援該分割區類型。$ivPartitonType 是整數值,來自硬碟 DOS 相容分割區表的作業系統位元組 [也就是 x86-based Win32 的分割區表,例如,不是用於 Alpha 處理器的 Windows NT 的分割區表]。例如,PARTITION_INFORMATION 結構的 PartitionType 成員。

$ivPartitionType 的常見值包括 PARTITION_FAT_12==1PARTITION_FAT_16==4PARTITION_EXTENDED==5PARTITION_FAT32==0xB

IsContainerPartition
IsContainerPartition( $ivPartitionType )

取得分割區類型,並傳回該分割區是否為 Win32 支援的「容器」分割區,也就是是否為可以包含「邏輯」分割區的「延伸」分割區。$ivPartitonTypeIsRecognizedPartition 相同。

MoveFile
MoveFile( $sOldName, $sNewName )

重新命名檔案或目錄。$sOldName 是要重新命名的現有檔案或目錄的名稱。$sNewName 是要給檔案或目錄的新名稱。如果搬移成功,會傳回 true 值。如果失敗,會傳回 false 值,並將 fileLastErorr()$^E 設為失敗原因。

檔案可以在檔案系統之間「重新命名」,而且檔案內容和一些屬性會被搬移。目錄只能在一個檔案系統內重新命名。如果已經有檔案或目錄的名稱是 $sNewName,則 MoveFile 會失敗。

MoveFileEx
MoveFileEx( $sOldName, $sNewName, $uFlags )

重新命名檔案或目錄。$sOldName 是要重新命名的現有檔案或目錄的名稱。$sNewName 是要給檔案或目錄的新名稱。如果搬移成功,會傳回 true 值。如果失敗,會傳回 false 值,並將 fileLastErorr()$^E 設為失敗原因。

$uFlags 是未簽署值,設定下列其中一個或多個位元

MOVEFILE_REPLACE_EXISTING

如果設定此位元,且已存在名為 $sNewName 的檔案 [但不是目錄],則它會被 $sOldName 取代。如果未設定此位元,則 MoveFileEx 會失敗,而不是取代現有的 $sNewName

MOVEFILE_COPY_ALLOWED

允許檔案 [但不是目錄] 透過複製 $sOldName 檔案資料和一些屬性至 $sNewName,然後刪除 $sOldName,在檔案系統之間移動。如果未設定此位元 [或如果 $sOldName 表示目錄],且 $sNewName 參考與 $sOldName 不同的檔案系統,則 MoveFileEx 會失敗。

MOVEFILE_DELAY_UNTIL_REBOOT

進行初步驗證,然後新增一個項目至登錄,以導致在下次啟動此作業系統副本時 [在任何自動檔案系統檢查完成後] 執行重新命名 [或刪除] 作業。Windows 95 不支援此功能。

設定此位元時,$sNewName 可以是 [] [表示 NULL],以指出應在下次啟動時刪除 $sOldName,而不是重新命名。

同時設定 MOVEFILE_COPY_ALLOWEDMOVEFILE_DELAY_UNTIL_REBOOT 位元會導致 MoveFileEx 失敗。

MOVEFILE_WRITE_THROUGH

確保 MoveFileEx 在作業完成並已寫入磁碟後才會傳回。Windows 95 不支援此功能。僅影響重新命名檔案至另一個檔案系統,並在複製作業結束時強制執行緩衝區寫入。

OsFHandleOpen
OsFHandleOpen( FILE, $hNativeHandle, $sMode )

開啟一個 Perl 檔案控制代號,基於一個已經開啟的 Win32 原生檔案控制代號 [非常類似於 C 的 fdopen() 函式與檔案描述符的運作方式]。如果開啟操作成功,則傳回一個真值。如果失敗,則傳回一個假值,並將 $! [以及可能還有 fileLastError()$^E] 設為失敗原因。

FILE 是 Perl 檔案控制代號 [採用任何支援的格式,一個裸字、一個字串、一個類型球體或一個類型球體的參考],將會被開啟。如果 FILE 已經開啟,則在重新開啟之前,它會自動關閉。

$hNativeHandle 是開啟的 Win32 原生檔案控制代號,可能是來自 CreateFilecreateFile 的傳回值。

$sMode 是來自 "rwatb" 的零個或多個字母的字串。這些會轉換成 O_RDONLY ["r"]、O_WRONLY ["w"]、O_RDWR ["rw"]、O_APPEND ["a"]、O_TEXT ["t"] 和 O_BINARY ["b"] 旗標的組合 [請參閱 Fcntl 模組],這些旗標會傳遞給 OsFHandleOpenFd。目前只有 O_APPENDO_TEXT 有任何意義。

此外,$sMode 中的 "r" 和/或 "w" 用於決定檔案描述符如何轉換成 Perl 檔案控制代號,即使這似乎沒有造成任何差異。下列其中一個會被使用

open( FILE, "<&=".$ivFd )	# "r" w/o "w"
open( FILE, ">&=".$ivFd )	# "w" w/o "r"
open( FILE, "+<&=".$ivFd )	# both "r" and "w"

OsFHandleOpen 最終呼叫 Win32 特定的 C 常式 _open_osfhandle() 或 Perl 的「改良」版本,稱為 win32_open_osfhandle()。在 Perl5.005 之前,會呼叫 C 的 _open_osfhandle(),如果 GetFileType($hNativeHandle) 會傳回 FILE_TYPE_UNKNOWN,則呼叫會失敗。對於 Perl5.005 和之後的版本,OsFHandleOpen 會從 Perl DLL 呼叫 win32_open_osfhandle(),它沒有這個限制。

OsFHandleOpenFd
$ivFD= OsFHandleOpenFd( $hNativeHandle, $uMode )

開啟一個檔案描述符 [$ivFD],基於一個已經開啟的 Win32 原生檔案控制代號 $hNativeHandle。這只會呼叫 Win32 特定的 C 常式 _open_osfhandle() 或 Perl 的「改良」版本,稱為 win32_open_osfhandle()。在 Perl5.005 之前和 Cygwin Perl 中,會呼叫 C 的 _open_osfhandle(),如果 GetFileType($hNativeHandle) 會傳回 FILE_TYPE_UNKNOWN,則呼叫會失敗。對於 Perl5.005 和之後的版本,OsFHandleOpenFd 會從 Perl DLL 呼叫 win32_open_osfhandle(),它沒有這個限制。

$uModeFcntl 模組所匯出的零個或多個 O_* 常數的邏輯組合。目前只有 O_APPENDO_TEXT 有任何意義。

如果開啟操作成功,$ivFD 將為非負值。如果失敗,則傳回 -1,並將 $! [以及可能的 fileLastError()$^E] 設為失敗原因。

QueryDosDevice
$olTargetLen= QueryDosDevice( $sDosDeviceName, $osTargetPath, $lTargetBuf )

查詢指定的「DOS」裝置名稱的定義,產生目前的 Windows NT 原生裝置名稱,以及任何目前處於休眠狀態的定義。

$sDosDeviceName 是我們要取得其定義的「DOS」裝置名稱。例如,"C:""COM1""PhysicalDrive0"。如果 $sDosDeviceName[] [對於 NULL],則會傳回所有 DOS 裝置名稱的清單。

$osTargetPath 將會指定一個包含定義清單的字串。每個定義都以 '\0' 結束,並串聯到字串中,最近的定義在最前面,整個字串的結尾處有一個額外的 '\0' [請參閱 GetLogicalDriveStrings 以取得此格式的範例]。

$lTargetBuf 是要為 $osTargetPath 分配的緩衝區大小 [以位元組為單位]。請參閱 "緩衝區大小" 以取得更多資訊。

$olTargetLen 設為寫入 $osTargetPath 的位元組數,但您也可以使用 length($osTargetPath) 來判斷這一點。

如果失敗,則傳回 0,並將 fileLastError()$^E 設為失敗原因。

ReadFile
ReadFile( $hFile, $opBuffer, $lBytes, $olBytesRead, $pOverlapped )

從檔案或類檔案裝置讀取位元組。如果讀取操作成功,則傳回 true 值。如果失敗,則傳回 false 值,並設定 fileLastError()$^E 以表示失敗原因。

$hFile 是 Win32 原生檔案控制代碼,已開啟可供讀取的檔案或裝置。

$opBuffer 會設定為包含已讀取位元的字串。

$lBytes 是您想要讀取的位元組數。$opBuffer 會自動初始化為一個緩衝區,其大小足夠容納這麼多位元組。與其他緩衝區大小不同,$lBytes 不需要加上前置的 "=",以防止將較大的值傳遞給底層 Win32 ReadFile API。不過,即使已啟用 Perl 警告,前置的 "=" 仍會被靜默忽略。

如果 $olBytesRead 不為 [],它會設定為實際讀取的位元組數,不過也可以使用 length($opBuffer) 來判斷。

$pOverlapped[] 或打包為字串的 OVERLAPPED 結構。這只有在 $hFile 以設定 FILE_FLAG_OVERLAPPED 旗標開啟時才有用。

SetErrorMode
$uOldMode= SetErrorMode( $uNewMode )

設定控制系統錯誤處理的模式傳回前一個模式值。$uOldMode$uNewMode 都會設定下列其中一個或多個位元組

SEM_FAILCRITICALERRORS

如果設定,表示在遇到重大錯誤時,觸發錯誤的呼叫會立即失敗。通常這個位元組不會設定,這表示重大錯誤會導致對話方塊出現,通知桌面使用者某個應用程式已觸發重大錯誤。對話方塊允許桌面使用者決定是否將重大錯誤傳回程序、忽略,或重試有問題的操作。

這會影響 CreateFileGetVolumeInformation 呼叫。

設定這個位元組有助於讓您檢查軟碟機中是否有軟碟。

SEM_NOALIGNMENTFAULTEXCEPT

如果設定,這會導致記憶體存取未對齊的錯誤以一種對程序不可見的方式自動修正。此旗標在基於 x86 的 Windows NT 版本中會被忽略。此旗標在 Windows 95 中不受支援。

SEM_NOGPFAULTERRORBOX

如果設定,一般保護錯誤不會產生對話框,但可以透過例外處理常式由程序處理。不瞭解如何處理此類錯誤的程式不應設定此位元。

SEM_NOOPENFILEERRORBOX

如果設定,則當嘗試繼續讀取或寫入已開啟的檔案 [通常在可移除式媒體上,例如磁碟片] 時發現檔案不再可用,呼叫會立即失敗。通常此位元未設定,這表示會出現對話框,通知桌面使用者某些應用程式遇到此問題。對話框允許桌面使用者決定是否將失敗傳回程序、忽略失敗或重試有問題的操作。

這會影響 ReadFileWriteFile 呼叫。

setFilePointer
$uNewPos = setFilePointer( $hFile, $ivOffset, $uFromWhere )

這是 SetFilePointer API (如下) 的 perl 友善包裝函式。如果您的 Perl 沒有 64 位元整數,$ivOffset 可以是 64 位元整數或 Math::BigInt 物件。傳回值是新的偏移量,同樣會是 64 位元整數或 Math::BigInt 物件。

SetFilePointer
$uNewPos = SetFilePointer( $hFile, $ivOffset, $ioivOffsetHigh, $uFromWhere )

seek() 的原生 Win32 版本。SetFilePointer 會設定檔案中下一次讀取或寫入作業將開始的位置。

$hFile 是原生 Win32 檔案控制代碼。

$uFromWhereFILE_BEGINFILE_CURRENTFILE_END,分別表示新的檔案位置是相對於檔案開頭、目前的檔案指標或檔案結尾指定。

$ivOffset 是 [如果 $ioivOffsetHigh[]] 從 $uFromWhere 指定的位置到新檔案位置的偏移量 [以位元組為單位]。如果 $ioivOffsetHigh 不是 [],則 $ivOffset 會轉換成未簽名的值,用作偏移量的低階 4 個位元組。

$ioivOffsetHigh 可以是 [] [表示 NULL],表示您只指定 4 個位元組的偏移量,而產生的檔案位置會小於或等於 0xFFFFFFFE [略小於 4GB]。否則,$ioivOfffsetHigh 會從偏移量的最高階 4 個位元組 [已簽名] 開始,並設定為產生的檔案位置的 [未簽名] 最高階 4 個位元組。

底層的 SetFilePointer 會傳回 0xFFFFFFFF 表示失敗,但如果 $ioivOffsetHigh 不是 [],您還必須檢查 $^E,以確定 0xFFFFFFFF 是否表示錯誤。Win32API::File::SetFilePointer 會為您執行此檢查,並且只有在底層 SetFilePointer 失敗時才會傳回 false 值。因此,如果您將檔案指標設定到檔案開頭 [或低階 4 個位元組為 0 的任何位置],則 $uNewPos 會設定為 "0 但為 true"

因此,如果尋找作業成功,傳回值會為 true。如果失敗,會傳回 false 值,而 fileLastError()$^E 會設定為失敗原因。

SetHandleInformation
SetHandleInformation( $hObject, $uMask, $uFlags )

設定與原生 Win32 檔案控制代碼或物件控制代碼相關聯的旗標。如果作業成功,傳回 true 值。如果失敗,傳回 false 值,並設定 fileLastError()$^E,以表示失敗原因。

$hObject 是開啟的 Win32 原生檔案控制代碼或開啟的 Win32 原生控制代碼,用於其他類型的物件。

$uMask 是未簽名的值,設定其中一個或多個位元組 HANDLE_FLAG_INHERITHANDLE_FLAG_PROTECT_FROM_CLOSESetHandleInformation 只會修改 $uMask 中設定的位元組。

$uFlags 是具有零個或多個已設定的位元 HANDLE_FLAG_INHERITHANDLE_FLAG_PROTECT_FROM_CLOSE 的未簽署值。對於 $uMask 中設定的每個位元,句柄旗標中的對應位元會設定為 $uFlags 中對應位元的數值。

如果 $uOldFlags 是呼叫 SetHandleInformation 之前的句柄旗標值,則呼叫之後句柄旗標的值會是

( $uOldFlags & ~$uMask ) | ( $uFlags & $uMask )

[至少在 HANDLE_FLAG_INHERITHANDLE_FLAG_PROTECT_FROM_CLOSE 位元相關的部分。]

請參閱 ":HANDLE_FLAG_" 匯出類別,以了解這些位元的意義。

WriteFile
WriteFile( $hFile, $pBuffer, $lBytes, $ouBytesWritten, $pOverlapped )

將位元組寫入檔案或類檔案裝置。如果操作成功,則傳回 true 值。如果失敗,則傳回 false 值,並設定 fileLastError()$^E,以說明失敗的原因。

$hFile 是 Win32 原生檔案控制代碼,已開啟要寫入的檔案或裝置。

$pBuffer 是包含要寫入位元組的字串。

$lBytes 是您想要寫入的位元組數。如果 $pBuffer 的長度小於 $lBytesWriteFile 會發生 croaks。您可以指定 0$lBytes,以寫入 length($pBuffer) 位元組。即使啟用 Perl 警告,$lBytes 上的開頭 "=" 也會被自動忽略。

除非您將 $ouBytesWritten 指定為 [],否則會將其設定為實際寫入的位元組數。

$pOverlapped[] 或封裝在字串中的 OVERLAPPED 結構。這只有在使用 FILE_FLAG_OVERLAPPED 旗標開啟 $hFile 時才有用。

":FuncA"

特定於 ASCII 的函式。每個函式都與沒有尾隨「A」的版本相同。

CopyFileA
CreateFileA
DefineDosDeviceA
DeleteFileA
GetDriveTypeA
GetFileAttributesA
GetLogicalDriveStringsA
GetVolumeInformationA
MoveFileA
MoveFileExA
QueryDosDeviceA
":FuncW"

寬字元專用 (Unicode) 函數。除了沒有尾碼「W」的版本外,這些函數都相同,但字串預期為 Unicode,而且某些長度會以 `WCHAR` 數量而非位元組數目測量,如下所示。

CopyFileW
CopyFileW( $swOldFileName, $swNewFileName, $bFailIfExists )

$swOldFileName$swNewFileName 是 Unicode 字串。

CreateFileW
$hObject= CreateFileW( $swPath, $uAccess, $uShare, $pSecAttr, $uCreate, $uFlags, $hModel )

$swPath 是 Unicode。

DefineDosDeviceW
DefineDosDeviceW( $uFlags, $swDosDeviceName, $swTargetPath )

$swDosDeviceName$swTargetPath 是 Unicode。

DeleteFileW
DeleteFileW( $swFileName )

$swFileName 是 Unicode。

GetDriveTypeW
$uDriveType= GetDriveTypeW( $swRootPath )

$swRootPath 是 Unicode。

GetFileAttributesW
$uAttrs= GetFileAttributesW( $swPath )

$swPath 是 Unicode。

GetLogicalDriveStringsW
$olwOutLength= GetLogicalDriveStringsW( $lwBufSize, $oswBuffer )

Unicode 儲存在 $oswBuffer 中。$lwBufSize$olwOutLength 測量為 `WCHAR` 數量。

GetVolumeInformationW
GetVolumeInformationW( $swRootPath, $oswVolName, $lwVolName, $ouSerialNum, $ouMaxNameLen, $ouFsFlags, $oswFsType, $lwFsType )

$swRootPath 是 Unicode,而且 Unicode 會寫入 $oswVolName$oswFsType$lwVolName$lwFsType 測量為 `WCHAR` 數量。

MoveFileW
MoveFileW( $swOldName, $swNewName )

$swOldName$swNewName 是 Unicode。

MoveFileExW
MoveFileExW( $swOldName, $swNewName, $uFlags )

$swOldName$swNewName 是 Unicode。

QueryDosDeviceW
$olwTargetLen= QueryDosDeviceW( $swDeviceName, $oswTargetPath, $lwTargetBuf )

$swDeviceName 是 Unicode,Unicode 寫入 $oswTargetPath$lwTargetBuf$olwTargetLenWCHAR 數量衡量。

":Misc"

其他常數。用於 CreateFile$uCreate 參數或 SetFilePointer$uFromWhere 參數。加上 INVALID_HANDLE_VALUE,通常不需要檢查,因為大多數例程會將其轉換為 false 值。

CREATE_ALWAYS		CREATE_NEW		OPEN_ALWAYS
OPEN_EXISTING		TRUNCATE_EXISTING	INVALID_HANDLE_VALUE
FILE_BEGIN		FILE_CURRENT		FILE_END
":DDD_"

DefineDosDevice$uFlags 參數的常數。

DDD_EXACT_MATCH_ON_REMOVE
DDD_RAW_TARGET_PATH
DDD_REMOVE_DEFINITION
":DRIVE_"

GetDriveType 回傳的常數。

DRIVE_UNKNOWN		DRIVE_NO_ROOT_DIR	DRIVE_REMOVABLE
DRIVE_FIXED		DRIVE_REMOTE		DRIVE_CDROM
DRIVE_RAMDISK
":FILE_"

可透過 CreateFile$uAccess 參數要求的特定檔案存取類型。

FILE_READ_DATA			FILE_LIST_DIRECTORY
FILE_WRITE_DATA			FILE_ADD_FILE
FILE_APPEND_DATA		FILE_ADD_SUBDIRECTORY
FILE_CREATE_PIPE_INSTANCE	FILE_READ_EA
FILE_WRITE_EA			FILE_EXECUTE
FILE_TRAVERSE			FILE_DELETE_CHILD
FILE_READ_ATTRIBUTES		FILE_WRITE_ATTRIBUTES
FILE_ALL_ACCESS			FILE_GENERIC_READ
FILE_GENERIC_WRITE		FILE_GENERIC_EXECUTE )],
":FILE_ATTRIBUTE_"

檔案屬性常數。由 attrLetsToBits 回傳,並用於 CreateFile$uFlags 參數。

FILE_ATTRIBUTE_ARCHIVE			FILE_ATTRIBUTE_COMPRESSED
FILE_ATTRIBUTE_HIDDEN			FILE_ATTRIBUTE_NORMAL
FILE_ATTRIBUTE_OFFLINE			FILE_ATTRIBUTE_READONLY
FILE_ATTRIBUTE_SYSTEM			FILE_ATTRIBUTE_TEMPORARY

此外,GetFileAttributes 可以回傳這些常數(或在發生錯誤時回傳 INVALID_FILE_ATTRIBUTES)。

FILE_ATTRIBUTE_DEVICE			FILE_ATTRIBUTE_DIRECTORY
FILE_ATTRIBUTE_ENCRYPTED		FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
FILE_ATTRIBUTE_REPARSE_POINT	FILE_ATTRIBUTE_SPARSE_FILE
":FILE_FLAG_"

檔案選項旗標常數。用於 CreateFile$uFlags 參數。

FILE_FLAG_BACKUP_SEMANTICS	FILE_FLAG_DELETE_ON_CLOSE
FILE_FLAG_NO_BUFFERING		FILE_FLAG_OVERLAPPED
FILE_FLAG_POSIX_SEMANTICS	FILE_FLAG_RANDOM_ACCESS
FILE_FLAG_SEQUENTIAL_SCAN	FILE_FLAG_WRITE_THROUGH
FILE_FLAG_OPEN_REPARSE_POINT
":FILE_SHARE_"

檔案共用常數。用於 CreateFile$uShare 參數。

FILE_SHARE_DELETE	FILE_SHARE_READ		FILE_SHARE_WRITE
":FILE_TYPE_"

檔案類型常數。由 GetFileType 傳回。

FILE_TYPE_CHAR		FILE_TYPE_DISK
FILE_TYPE_PIPE		FILE_TYPE_UNKNOWN
":FS_"

檔案系統特性常數。置於 GetVolumeInformation$ouFsFlags 參數中。

FS_CASE_IS_PRESERVED		FS_CASE_SENSITIVE
FS_UNICODE_STORED_ON_DISK	FS_PERSISTENT_ACLS 
FS_FILE_COMPRESSION		FS_VOL_IS_COMPRESSED
":HANDLE_FLAG_"

修改物件控制代碼行為的旗標位元,並透過 GetHandleInformationSetHandleInformation 存取。

HANDLE_FLAG_INHERIT

如果設定此位元,則繼承控制代碼的此程序之子 [亦即由 Win32 CreateProcess API 呼叫所建立的程序,其中 bInheritHandles 參數指定為 TRUE],將會繼承此特定物件控制代碼。

HANDLE_FLAG_PROTECT_FROM_CLOSE

如果設定此位元,則針對此控制代碼的 CloseHandle 呼叫將會被忽略,讓控制代碼保持開啟且可用。

":IOCTL_STORAGE_"

一般儲存裝置的 I/O 控制操作。用於 DeviceIoControl$uIoControlCode 參數。包含 IOCTL_STORAGE_CHECK_VERIFYIOCTL_STORAGE_MEDIA_REMOVALIOCTL_STORAGE_EJECT_MEDIAIOCTL_STORAGE_LOAD_MEDIAIOCTL_STORAGE_RESERVEIOCTL_STORAGE_RELEASEIOCTL_STORAGE_FIND_NEW_DEVICESIOCTL_STORAGE_GET_MEDIA_TYPES

IOCTL_STORAGE_CHECK_VERIFY

驗證裝置的媒體是否可存取。$pInBuf$opOutBuf 都應為 []。如果 DeviceIoControl 傳回 true 值,則表示媒體目前可存取。

IOCTL_STORAGE_MEDIA_REMOVAL

允許鎖定或解鎖裝置的媒體。$opOutBuf 應為 []$pInBuf 應為 PREVENT_MEDIA_REMOVAL 資料結構,它只是一個包含布林值之整數

$pInBuf= pack( "i", $bPreventMediaRemoval );
IOCTL_STORAGE_EJECT_MEDIA

要求裝置退出媒體。$pInBuf$opOutBuf 都應為 []

IOCTL_STORAGE_LOAD_MEDIA

要求裝置載入媒體。$pInBuf$opOutBuf 都應為 []

IOCTL_STORAGE_RESERVE

要求保留裝置。$pInBuf$opOutBuf 都應為 []

IOCTL_STORAGE_RELEASE

釋放先前的裝置保留。$pInBuf$opOutBuf 都應為 []

IOCTL_STORAGE_FIND_NEW_DEVICES

未找到關於此 IOCTL 作業的文件。

IOCTL_STORAGE_GET_MEDIA_TYPES

要求裝置支援的媒體類型資訊。$pInBuf 應為 []$opOutBuf 將設定為包含 DISK_GEOMETRY 資料結構的向量,可透過下列方式解碼

    # Calculate the number of DISK_GEOMETRY structures returned:
    my $cStructs= length($opOutBuf)/(4+4+4+4+4+4);
    my @fields= unpack( "L l I L L L" x $cStructs, $opOutBuf )
    my( @ucCylsLow, @ivcCylsHigh, @uMediaType, @uTracksPerCyl,
      @uSectsPerTrack, @uBytesPerSect )= ();
    while(  @fields  ) {
	push( @ucCylsLow, unshift @fields );
	push( @ivcCylsHigh, unshift @fields );
	push( @uMediaType, unshift @fields );
	push( @uTracksPerCyl, unshift @fields );
	push( @uSectsPerTrack, unshift @fields );
	push( @uBytesPerSect, unshift @fields );
    }

對於第 $i 個支援的媒體類型,下列變數將包含下列資料。

$ucCylsLow[$i]

汽缸總數的低階 4 個位元組。

$ivcCylsHigh[$i]

汽缸總數的高階 4 個位元組。

$uMediaType[$i]

媒體類型的代碼。請參閱 ":MEDIA_TYPE" 匯出類別。

$uTracksPerCyl[$i]

每個汽缸中的磁軌數。

$uSectsPerTrack[$i]

每個磁軌中的扇區數。

$uBytesPerSect[$i]

每個扇區中的位元組數。

":IOCTL_DISK_"

磁碟裝置的 I/O 控制操作。用於 DeviceIoControl$uIoControlCode 參數。其中大部分用於實體磁碟機裝置,例如 "//./PhysicalDrive0"。不過,IOCTL_DISK_GET_PARTITION_INFOIOCTL_DISK_SET_PARTITION_INFO 應該只用於單一磁碟分割裝置,例如 "//./C:"。此外,IOCTL_DISK_GET_MEDIA_TYPES 已記載為已被取代,但用於軟碟機裝置,例如 "//./A:" 時仍然有用。

包括 IOCTL_DISK_FORMAT_TRACKSIOCTL_DISK_FORMAT_TRACKS_EXIOCTL_DISK_GET_DRIVE_GEOMETRYIOCTL_DISK_GET_DRIVE_LAYOUTIOCTL_DISK_GET_MEDIA_TYPESIOCTL_DISK_GET_PARTITION_INFOIOCTL_DISK_HISTOGRAM_DATAIOCTL_DISK_HISTOGRAM_RESETIOCTL_DISK_HISTOGRAM_STRUCTUREIOCTL_DISK_IS_WRITABLEIOCTL_DISK_LOGGINGIOCTL_DISK_PERFORMANCEIOCTL_DISK_REASSIGN_BLOCKSIOCTL_DISK_REQUEST_DATAIOCTL_DISK_REQUEST_STRUCTUREIOCTL_DISK_SET_DRIVE_LAYOUTIOCTL_DISK_SET_PARTITION_INFOIOCTL_DISK_VERIFY

IOCTL_DISK_GET_DRIVE_GEOMETRY

要求磁碟大小和結構的資訊。$pInBuf 應為 []$opOutBuf 將設定為 DISK_GEOMETRY 資料結構,可透過下列方式進行解碼

( $ucCylsLow, $ivcCylsHigh, $uMediaType, $uTracksPerCyl,
  $uSectsPerTrack, $uBytesPerSect )= unpack( "L l I L L L", $opOutBuf );
$ucCylsLow

汽缸總數的低階 4 個位元組。

$ivcCylsHigh

汽缸總數的高階 4 個位元組。

$uMediaType

媒體類型的代碼。請參閱 ":MEDIA_TYPE" 匯出類別。

$uTracksPerCyl

每個汽缸中的磁軌數。

$uSectsPerTrack

每個磁軌中的扇區數。

$uBytesPerSect

每個扇區中的位元組數。

IOCTL_DISK_GET_PARTITION_INFO

要求有關磁碟分割大小和幾何形狀的資訊。$pInBuf 應為 []$opOutBuf 將設定為 PARTITION_INFORMATION 資料結構,可透過下列方式進行解碼

( $uStartLow, $ivStartHigh, $ucHiddenSects, $uPartitionSeqNumber,
  $uPartitionType, $bActive, $bRecognized, $bToRewrite )=
  unpack( "L l L L C c c c", $opOutBuf );
$uStartLow$ivStartHigh

磁碟分割開始偏移量的低位元組和高位元組 [分別] 4 位元組,以位元組為單位量測。

$ucHiddenSects

此磁碟分割的「隱藏」扇區數目。實際上,這是此磁碟分割之前的扇區數目,亦即開始偏移量 [如 $uStartLow$ivStartHigh 所示] 除以每扇區的位元組數目。

$uPartitionSeqNumber

此磁碟分割的順序號碼。磁碟分割從 1 開始編號 [「磁碟分割 0」表示整個磁碟]。有時此欄位可能是 0,您必須從磁碟上在它之前有多少個磁碟分割來推論磁碟分割順序號碼。

$uPartitionType

磁碟分割類型。請參閱 ":PARTITION_" 匯出類別以取得已知類型的清單。另請參閱 IsRecognizedPartitionIsContainerPartition

$bActive

如果是活動 [開機] 磁碟分割,則為 1,否則為 0

$bRecognized

此類型的分割是否支援 Win32。

$bToRewrite

是否更新此分割資訊。IOCTL_DISK_GET_PARTITION_INFO 未使用此欄位。對於 IOCTL_DISK_SET_DRIVE_LAYOUT,您必須將此欄位設定為您希望變更、新增或刪除的任何分割的 true 值。

IOCTL_DISK_SET_PARTITION_INFO

變更分割類型。$opOutBuf 應為 []$pInBuf 應為 SET_PARTITION_INFORMATION 資料結構,只是一個包含新分割類型的單一位元組 [請參閱 ":PARTITION_" 匯出類別以取得已知類型的清單]

$pInBuf= pack( "C", $uPartitionType );
IOCTL_DISK_GET_DRIVE_LAYOUT

要求有關磁碟配置的資訊。$pInBuf 應為 []$opOutBuf 將設定為包含 DRIVE_LAYOUT_INFORMATION 結構,其中包含多個 PARTITION_INFORMATION 結構

    my( $cPartitions, $uDiskSignature )= unpack( "L L", $opOutBuf );
    my @fields= unpack( "x8" . ( "L l L L C c c c" x $cPartitions ),
		        $opOutBuf );
    my( @uStartLow, @ivStartHigh, @ucHiddenSects,
      @uPartitionSeqNumber, @uPartitionType, @bActive,
      @bRecognized, @bToRewrite )= ();
    for(  1..$cPartition  ) {
	push( @uStartLow, unshift @fields );
	push( @ivStartHigh, unshift @fields );
	push( @ucHiddenSects, unshift @fields );
	push( @uPartitionSeqNumber, unshift @fields );
	push( @uPartitionType, unshift @fields );
	push( @bActive, unshift @fields );
	push( @bRecognized, unshift @fields );
	push( @bToRewrite, unshift @fields );
    }
$cPartitions

如果磁碟上的分割數。

$uDiskSignature

是磁碟簽章,由磁碟管理員 [WinDisk.exe] 指定的唯一編號,用於識別磁碟。這允許該磁碟上分割的磁碟機代號保持不變,即使磁碟的 SCSI 目標 ID 已變更。

請參閱 IOCTL_DISK_GET_PARTITION_INFORMATION 以取得有關這些欄位的剩餘資訊。

IOCTL_DISK_GET_MEDIA_TYPES

應由 IOCTL_STORAGE_GET_MEDIA_TYPES 取代,但仍可協助判斷特定磁碟機可產生的軟碟格式類型。請參閱 ex/FormatFloppy.plx 以取得範例。

IOCTL_DISK_SET_DRIVE_LAYOUT

變更磁碟的分割配置。$pOutBuf 應為 []$pInBuf 應為 DISK_LAYOUT_INFORMATION 資料結構,其中包含多個 PARTITION_INFORMATION 資料結構。

    # Already set:  $cPartitions, $uDiskSignature, @uStartLow, @ivStartHigh,
    #   @ucHiddenSects, @uPartitionSeqNumber, @uPartitionType, @bActive,
    #   @bRecognized, and @bToRewrite.
    my( @fields, $prtn )= ();
    for $prtn (  1..$cPartition  ) {
	push( @fields, $uStartLow[$prtn-1], $ivStartHigh[$prtn-1],
	    $ucHiddenSects[$prtn-1], $uPartitionSeqNumber[$prtn-1],
	    $uPartitionType[$prtn-1], $bActive[$prtn-1],
	    $bRecognized[$prtn-1], $bToRewrite[$prtn-1] );
    }
    $pInBuf= pack( "L L" . ( "L l L L C c c c" x $cPartitions ),
		   $cPartitions, $uDiskSignature, @fields );

若要刪除分割,請將所有欄位歸零,但 $bToRewrite 例外,應設定為 1。若要新增分割,請增加 $cPartitions,並將新分割的資訊新增至陣列中,請務必將 1 插入 @bToRewrite。

請參閱 IOCTL_DISK_GET_DRIVE_LAYOUTIOCTL_DISK_GET_PARITITON_INFORMATION 以取得欄位的說明。

IOCTL_DISK_VERIFY

執行磁碟 [部分] 的邏輯格式化。$opOutBuf 應為 []$pInBuf 應包含 VERIFY_INFORMATION 資料結構

    $pInBuf= pack( "L l L",
		   $uStartOffsetLow, $ivStartOffsetHigh, $uLength );
$uStartOffsetLow$ivStartOffsetHigh

格式化應開始的偏移量 [以位元組為單位] 的低階和高階 [分別] 4 位元組。

$uLength

要格式化的區段長度 [以位元組為單位]。

IOCTL_DISK_FORMAT_TRACKS

格式化磁碟上的一系列磁軌。$opOutBuf 應為 []$pInBuf 應包含 FORMAT_PARAMETERS 資料結構

    $pInBuf= pack( "L L L L L", $uMediaType,
		   $uStartCyl, $uEndCyl, $uStartHead, $uEndHead );

$uMediaType 如果要格式化的媒體類型。主要用於指定格式化軟碟時要使用的密度。有關更多資訊,請參閱 ":MEDIA_TYPE" 匯出類別。

其餘欄位指定要格式化的磁軌範圍的起始和結束磁柱和磁頭。

IOCTL_DISK_REASSIGN_BLOCKS

將磁碟區塊清單重新指定給磁碟的備用區塊池。$opOutBuf 應為 []$pInBuf 應為 REASSIGN_BLOCKS 資料結構

$pInBuf= pack( "S S L*", 0, $cBlocks, @uBlockNumbers );
IOCTL_DISK_PERFORMANCE

要求有關磁碟效能的資訊。$pInBuf 應為 []$opOutBuf 將設定為包含 DISK_PERFORMANCE 資料結構

    my( $ucBytesReadLow, $ivcBytesReadHigh,
	$ucBytesWrittenLow, $ivcBytesWrittenHigh,
	$uReadTimeLow, $ivReadTimeHigh,
	$uWriteTimeLow, $ivWriteTimeHigh,
	$ucReads, $ucWrites, $uQueueDepth )=
	unpack( "L l L l L l L l L L L", $opOutBuf );
IOCTL_DISK_IS_WRITABLE

未找到關於此 IOCTL 作業的文件。

IOCTL_DISK_LOGGING

控制磁碟記錄。對於此 IOCTL 操作,找到的說明文件很少。它使用 DISK_LOGGING 資料結構

DISK_LOGGING_START

開始記錄磁碟裝置驅動程式內部緩衝區中的每個磁碟要求,大小為 $uLogBufferSize

$pInBuf= pack( "C L L", 0, 0, $uLogBufferSize );
DISK_LOGGING_STOP

停止記錄每個磁碟要求

$pInBuf= pack( "C L L", 1, 0, 0 );
DISK_LOGGING_DUMP

將內部記錄複製到提供的緩衝區中

$pLogBuffer= ' ' x $uLogBufferSize
$pInBuf= pack( "C P L", 2, $pLogBuffer, $uLogBufferSize );

( $uByteOffsetLow[$i], $ivByteOffsetHigh[$i],
  $uStartTimeLow[$i], $ivStartTimeHigh[$i],
  $uEndTimeLog[$i], $ivEndTimeHigh[$i],
  $hVirtualAddress[$i], $ucBytes[$i],
  $uDeviceNumber[$i], $bWasReading[$i] )=
  unpack( "x".(8+8+8+4+4+1+1+2)." L l L l L l L L C c x2", $pLogBuffer );
DISK_LOGGING_BINNING

根據要求大小將統計資料分組到 bin 中。

$pInBuf= pack( "C P L", 3, $pUnknown, $uUnknownSize );
IOCTL_DISK_FORMAT_TRACKS_EX

未包含此 IOCTL 的說明文件。

IOCTL_DISK_HISTOGRAM_STRUCTURE

未包含此 IOCTL 的說明文件。

IOCTL_DISK_HISTOGRAM_DATA

未包含此 IOCTL 的說明文件。

IOCTL_DISK_HISTOGRAM_RESET

未包含此 IOCTL 的說明文件。

IOCTL_DISK_REQUEST_STRUCTURE

未找到關於此 IOCTL 作業的文件。

IOCTL_DISK_REQUEST_DATA

未找到關於此 IOCTL 作業的文件。

":FSCTL_"

檔案系統控制操作。用於 DeviceIoControl$uIoControlCode 參數中。

包含 FSCTL_SET_REPARSE_POINTFSCTL_GET_REPARSE_POINTFSCTL_DELETE_REPARSE_POINT

FSCTL_SET_REPARSE_POINT

設定要與 $hDevice 關聯的重新剖析點資料。

FSCTL_GET_REPARSE_POINT

擷取與 $hDevice 關聯的重新剖析點資料。

FSCTL_DELETE_REPARSE_POINT

刪除與 $hDevice 關聯的重新剖析點資料。

":GENERIC_"

指定不特定於一種物件類型的常數,用於指定一般存取權限。

GENERIC_ALL			GENERIC_EXECUTE
GENERIC_READ		GENERIC_WRITE
":MEDIA_TYPE"

裝置可以支援的不同類別媒體。用於 DISK_GEOMETRY 結構的 $uMediaType 欄位中。

Unknown

格式不明。

F5_1Pt2_512

5.25" 軟碟,1.2MB [實際上為 1,200KB] 總空間,每扇區 512 位元組。

F3_1Pt44_512

3.5" 軟碟,1.44MB [實際上為 1,440KB] 總空間,每扇區 512 位元組。

F3_2Pt88_512

3.5" 軟碟,2.88MB [實際上為 2,880KB] 總空間,每扇區 512 位元組。

F3_20Pt8_512

3.5" 軟碟,20.8MB 總空間,每扇區 512 位元組。

F3_720_512

3.5" 軟碟,720KB 總空間,每扇區 512 位元組。

F5_360_512

5.25" 軟碟,360KB 總空間,每扇區 512 位元組。

F5_320_512

5.25" 軟碟,320KB 總空間,每扇區 512 位元組。

F5_320_1024

5.25" 軟碟,320KB 總空間,每扇區 1024 位元組。

F5_180_512

5.25" 軟碟,180KB 總空間,每扇區 512 位元組。

F5_160_512

5.25" 軟碟,160KB 總空間,每扇區 512 位元組。

RemovableMedia

軟碟以外的可移除媒體類型。

FixedMedia

固定硬碟。

F3_120M_512

3.5" 軟碟,120MB 總空間。

":MOVEFILE_"

常數,用於 MoveFileEx$uFlags 引數。

MOVEFILE_COPY_ALLOWED		MOVEFILE_DELAY_UNTIL_REBOOT
MOVEFILE_REPLACE_EXISTING	MOVEFILE_WRITE_THROUGH
":SECURITY_"

安全性服務品質值,如果開啟命名管道的用戶端,可以使用 CreateFile 中的 $uFlags 引數。

SECURITY_ANONYMOUS		SECURITY_CONTEXT_TRACKING
SECURITY_DELEGATION		SECURITY_EFFECTIVE_ONLY
SECURITY_IDENTIFICATION		SECURITY_IMPERSONATION
SECURITY_SQOS_PRESENT
":SEM_"

SetErrorMode 搭配使用的常數。

SEM_FAILCRITICALERRORS		SEM_NOGPFAULTERRORBOX
SEM_NOALIGNMENTFAULTEXCEPT	SEM_NOOPENFILEERRORBOX
":PARTITION_"

描述分割區類型的常數。

PARTITION_ENTRY_UNUSED		PARTITION_FAT_12
PARTITION_XENIX_1		PARTITION_XENIX_2
PARTITION_FAT_16		PARTITION_EXTENDED
PARTITION_HUGE			PARTITION_IFS
PARTITION_FAT32			PARTITION_FAT32_XINT13
PARTITION_XINT13		PARTITION_XINT13_EXTENDED
PARTITION_PREP			PARTITION_UNIX
VALID_NTFT			PARTITION_NTFT
":STD_HANDLE_"

GetStdHandle 和 SetStdHandle 的常數

STD_ERROR_HANDLE
STD_INPUT_HANDLE
STD_OUTPUT_HANDLE
":ALL"

以上所有。

BUGS

目前沒有已知的錯誤。

AUTHOR

Tye McQueen,tye@metronet.com,http://perlmonks.org/?node=tye。

SEE ALSO

金字塔。