GetFileInformationByHandle オープンしているファイルの情報取得

Cの宣言:

BOOL GetFileInformationByHandle(
	HANDLE hFile,
	LPBY_HANDLE_FILE_INFORMATION FileInformation);

VBの宣言:

Declare Function GetFileInformationByHandle Lib "kernel32" ( _
    ByVal hFile As Long, _
    ByRef fi As BY_HANDLE_FILE_INFORMATION) As Long

説明:

現在オープンしているファイルの情報を取得する。

この関数を用いて、二つのファイルハンドルが同一のファイルを示しているか否かを判定することができる。

引数の意味は、以下の通り。
hFile (IN) 情報を取得する、オープンしているファイルのハンドル。
FileInformation (OUT) 取得結果の情報を格納する構造体。

戻り値は、情報の取得に成功したか否かを表す真偽値である。

Cのサンプル:

void DoGetFileInfoByHandle()
{
	HANDLE hFile;
	BY_HANDLE_FILE_INFORMATION fi;
	FILETIME ft;

	hFile = CreateFile(
		"c:\\command.com",
		0,
		FILE_SHARE_READ | FILE_SHARE_WRITE,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL);

	GetFileInformationByHandle(hFile, &fi);

	printf("属性:\n");
	if(fi.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE) printf("アーカイブ\n");
	if(fi.dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED) printf("圧縮\n");
	if(fi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) printf("ディレクトリ\n");
	if(fi.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) printf("隠しファイル/ディレクトリ\n");
	if(fi.dwFileAttributes & FILE_ATTRIBUTE_NORMAL) printf("ノーマル\n");
	if(fi.dwFileAttributes & FILE_ATTRIBUTE_READONLY) printf("書込み禁止\n");
	if(fi.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) printf("システム\n");
	if(fi.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY) printf("一時ファイル/ディレクトリ\n");

	FileTimeToLocalFileTime(&fi.ftCreationTime, &ft);
	FileTimeToSystemTime(&ft, &st);
	printf("作成時刻: %04d/%02d/%02d %02d:%02d:%02d.%d\n",
		st.wYear, st.wMonth, st.wDay,
		st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);

	FileTimeToLocalFileTime(&fi.ftLastAccessTime, &ft);
	FileTimeToSystemTime(&ft, &st);
	printf("最終アクセス時刻: %04d/%02d/%02d %02d:%02d:%02d.%d\n",
		st.wYear, st.wMonth, st.wDay,
		st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);

	FileTimeToLocalFileTime(&fi.ftLastWriteTime, &ft);
	FileTimeToSystemTime(&ft, &st);
	printf("最終書き込み時刻: %04d/%02d/%02d %02d:%02d:%02d.%d\n",
		st.wYear, st.wMonth, st.wDay,
		st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);

	printf("ボリュームのシリアルナンバー: %ud\n", fi.dwVolumeSerialNumber);
	printf("ファイルサイズ: %ud*2^32+%ud\n", fi.nFileSizeHigh, fi.nFileSizeLow);
	printf("リンク数: %d\n", fi.nNumberOfLinks);
	printf("ファイルID: %08X%08X", fi.nFileIndexHigh, fi.nFileIndexLow);

	CloseHandle(hFile);
}

VBのサンプル:

'主な宣言
Public Type BY_HANDLE_FILE_INFORMATION
	Attributes As Long
	CreationTime As FILETIME
	AccessTime As FILETIME
	WriteTime As FILETIME
	VolumeSerialNumber As Long
	FileSizeHigh As Long
	FileSizeLow As Long
	LinkNum As Long
	FileIndexHigh As Long
	FileIndexLow As Long
End Type

Public Type SYSTEMTIME
	Year As Integer
	Month As Integer
	DayOfWeek As Integer
	Day As Integer
	Hour As Integer
	Minute As Integer
	Second As Integer
	Milliseconds As Integer
End Type

' ファイル情報の表示
Private Sub DispFileInfoByHandle()

	Dim fi As BY_HANDLE_FILE_INFORMATION
	Dim hFile As Long
	Dim ft As FILETIME
	Dim st As SYSTEMTIME

	'ファイルのオープン
	hFile = CreateFile("a:\command.com", 0, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)
	    
	'ファイル情報の取得
	GetFileInformationByHandle hFile, fi

	'ファイル情報の表示
	If (fi.Attributes And FILE_ATTRIBUTE_ARCHIVE) <> 0 Then Debug.Print "アーカイブ"
	f (fi.Attributes And FILE_ATTRIBUTE_COMPRESSED) <> 0 Then Debug.Print "圧縮"
	If (fi.Attributes And FILE_ATTRIBUTE_DIRECTORY) <> 0 Then Debug.Print "ディレクトリ"
	If (fi.Attributes And FILE_ATTRIBUTE_HIDDEN) <> 0 Then Debug.Print "隠しファイル/ディレクトリ"
	If (fi.Attributes And FILE_ATTRIBUTE_NORMAL) <> 0 Then Debug.Print "ノーマル"
	If (fi.Attributes And FILE_ATTRIBUTE_READONLY) <> 0 Then Debug.Print "書込み禁止"
	If (fi.Attributes And FILE_ATTRIBUTE_SYSTEM) <> 0 Then Debug.Print "システム"
	If (fi.Attributes And FILE_ATTRIBUTE_TEMPORARY) <> 0 Then Debug.Print "一時ファイル/ディレクトリ"

	FileTimeToLocalFileTime fi.CreationTime, ft
	FileTimeToSystemTime ft, st

	With st
		Debug.Print "作成時刻: " & _
			.Year & "/" & .Month & "/" & .Day & " " & _
			.Hour & ":" & .Minute & ":" & .Second
	End With

	FileTimeToLocalFileTime fi.AccessTime, ft
	FileTimeToSystemTime ft, st

	With st
		Debug.Print "最終アクセス時刻: " & _
			.Year & "/" & .Month & "/" & .Day & " " & _
			.Hour & ":" & .Minute & ":" & .Second
	End With

	FileTimeToLocalFileTime fi.WriteTime, ft
	FileTimeToSystemTime ft, st

	With st
		Debug.Print "最終書き込み時刻: " & _
			.Year & "/" & .Month & "/" & .Day & " " & _
			.Hour & ":" & .Minute & ":" & .Second
	End With

	Debug.Print "ボリュームのシリアルナンバー:" & Hex(fi.VolumeSerialNumber)
	Debug.Print "ファイルサイズ: " & fi.FileSizeHigh & "*2^32 +" & fi.FileSizeLow
	Debug.Print "リンク数: " & fi.LinkNum
	Debug.Print "ファイルID: " & Right("00000000", fi.FileIndexHigh) & Right("00000000", fi.FileIndexLow)

	'ファイルのクローズ
	CloseHandle hFile

End Sub


(original text:1998/12/25 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。