GetVolumeInformation ボリューム情報の取得

Cの宣言:

BOOL GetVolumeInformation(
	LPCTSTR RootPathName,
	LPTSTR VolumeName,
	DWORD VolumeNameSize,
	LPDWORD SerialNumber,
	LPDWORD MaxFileLen,
	LPDWORD FileSystemFlags,
	LPTSTR FileSystemName,
	DWORD FileSystemNameSize);

VBの宣言:

Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" ( _
	ByVal RootPathName As String, _
	ByVal VolumeName As String, _
	ByVal VolumeNameSize As Long, _
	ByRef SerialNumber As Long, _
	ByRef MaxFileLen As Long, _
	ByRef FileSystemFlags As Long, _
	ByVal FileSystemName As String, _
	ByVal FileSystemNameSize As Long) As Long

説明:

RootPathNameで指定したボリュームの情報を得る。RootPathNameが“C:”などと、ドライブ名のみの指定の場合は、そのドライブに現在のプロセスのカレントディレクトリがある場合はカレントディレクトリが指定されたものとみなされる。そのドライブ以外に現在のプロセスのカレントディレクトリが存在する場合は、指定したドライブのルートディレクトリが指定されたものとみなされる。

フロッピーディスクなどには、シリアル番号は存在しない。

ファイルシステムとは、“NTFS”や“FAT”等のことである。

引数の意味は、以下の通り。
RootPathName (IN) 取得するボリュームを表すルートディレクトリ名。NULLならば、カレントディレクトリが存在するドライブのルートパスとみなされる。
VolumeName (OUT) ボリューム名を受け取るバッファ
VolumeNameSize (IN) lpVolumeNameBufferのサイズ
SerialNumber (OUT) ボリュームのシリアル番号
MaxFileLen (OUT) ファイル名の最大長
FileSystemFlags (OUT) ボリュームに関する付加情報。後述の表を参照。
FileSystemName (OUT) ファイルシステム名を受け取るバッファ
FileSystemNameSize (IN) lpfileSystemNameBufferのサイズ

FileSystemFlagsに返される情報は、以下のフラグの論理和である。
FS_CASE_IS_PRESERVED ファイル名は、大文字/小文字の区別を保存できる。
FS_CASE_SENSITIVE ファイル検索時に、大文字/小文字の区別を認識できる。
FS_UNICODE_STORED_ON_DISK UNICODEファイル名を格納できる。
FS_PERSISTENT_ACLS セキュリティをサポートしている。
FS_FILE_COMPRESSION ファイルベースの圧縮をサポートしている。
FS_VOL_IS_COMPRESSED ボリュームは圧縮されている。

戻り値は、関数の実行に成功したか否かを表す真偽値である。

Cのサンプル:

void DispVolumeInformation()
{
	char VolumeName[1000];
	char SystemName[1000];
	DWORD SerialNumber;
	DWORD FileNameLength;
	DWORD Flags;

	GetVolumeInformation(
		"f:\\",
		VolumeName,
		1000,
		&SerialNumber,
		&FileNameLength,
		&Flags,
		SystemName,
		1000);
   
	printf("ファイルシステム名:%s\n", SystemName);
	printf("ボリューム名:%s\n", VolumeName);
	printf("シリアル番号:%u\n", SerialNumber);
	printf("ファイル名の最大長:%d\n", FileNameLength);
	
	if(Flags & FS_CASE_IS_PRESERVED) printf("保存時に大文字/小文字が区別される\n");
	if(Flags & FS_CASE_SENSITIVE) printf("大文字/小文字を区別したファイル検索をサポート\n");
	if(Flags & FS_UNICODE_STORED_ON_DISK) printf("UNICODEファイル名の格納サポート\n");
	if(Flags & FS_PERSISTENT_ACLS) printf("セキュリティあり\n");
	if(Flags & FS_FILE_COMPRESSION) printf("ファイルベースの圧縮サポート\n");
	if(Flags & FS_VOL_IS_COMPRESSED) printf("圧縮されたボリューム\n");
}

VBのサンプル:

' ボリューム情報の表示
Private Sub DispVolumeInfo()
	Dim VolumeName As String * 1000
	Dim SystemName As String * 1000
	Dim SerialNumber As Long
	Dim FileNameLength As Long
	Dim Flags As Long
	Dim Msg As String

	'ボリューム情報の取得
	GetVolumeInformation "a:\", VolumeName, 1000, SerialNumber, FileNameLength, Flags, SystemName, 1000

	'メッセージの作成
	Msg = "ファイルシステム名:" & Left(SystemName, InStr(SystemName, vbNullChar) - 1) & vbCr & _
	    "ボリューム名:" & Left(VolumeName, InStr(VolumeName, vbNullChar) - 1) & vbCr & _
	    "シリアル番号:" & SerialNumber & vbCr & _
	    "ファイル名の最大長:" & FileNameLength & vbCr
	    
	If (Flags And FS_CASE_IS_PRESERVED) <> 0 Then Msg = Msg & "保存時に大文字/小文字が区別される" & vbCr
	If (Flags And FS_CASE_SENSITIVE) <> 0 Then Msg = Msg & "大文字/小文字を区別したファイル検索をサポート" & vbCr
	If (Flags And FS_UNICODE_STORED_ON_DISK) <> 0 Then Msg = Msg & "UNICODEファイル名の格納サポート" & vbCr
	If (Flags And FS_PERSISTENT_ACLS) <> 0 Then Msg = Msg & "セキュリティあり" & vbCr
	If (Flags And FS_FILE_COMPRESSION) <> 0 Then Msg = Msg & "ファイルベースの圧縮サポート" & vbCr
	If (Flags And FS_VOL_IS_COMPRESSED) <> 0 Then Msg = Msg & "圧縮されたボリューム"

	'メッセージの表示
	MsgBox Msg
End Sub

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

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