ファイル情報を取得          <TOP>


CreateFile 指定したファイルをオープンし、デバイスハンドルを返す
GetFileInformationByHandle 指定されたファイルに関する情報を取得
CloseHandle オープンされているオブジェクトハンドルをクローズ
FileTimeToLocalFileTime 世界協定時刻形式ファイル時間をローカルファイル時間に変換
FileTimeToSystemTime ファイルタイムをシステムタイムに変換
 

 

'================================================================
'= ファイル情報を取得
'=    (GetFileInformationByHandle2.bas)
'================================================================
#include "Windows.bi"

#define INVALID_HANDLE_VALUE -1         '見つからない場合
#define GENERIC_READ -2147483648        '読み込みモード(&H80000000)
#define OPEN_EXISTING 3                 'ファイルをオープンする(存在しない場合失敗)
#define FILE_ATTRIBUTE_ARCHIVE &H20     'アーカイブ属性を示す定数
#define FILE_ATTRIBUTE_COMPRETSED &H800 '圧縮属性を示す定数
#define FILE_ATTRIBUTE_DIRECTORY &H10   'ディレクトリ属性
#define FILE_ATTRIBUTE_HIDDEN &H2       '隠しファイル属性
#define FILE_ATTRIBUTE_NORMAL &H80      '他のファイル属性を持たない
#define FILE_ATTRIBUTE_READONLY &H1     '読み込み専用属性
#define FILE_ATTRIBUTE_SYSTEM &H4       'システムファイル属性
#define FILE_ATTRIBUTE_TEMPORARY &H100  '一時ファイル属性を示す定数

Type SECURITY_ATTRIBUTES
    nLength              As Long
    lpSecurityDescriptor As Long
    bInheritHandle       As Long
End Type

Type FILETIME
    dwLowDateTime  As Long
    dwHighDateTime As Long
End Type

Type SYSTEMTIME
    wYear         As Integer
    wMonth        As Integer
    wDayOfWeek    As Integer
    wDay          As Integer
    wHour         As Integer
    wMinute       As Integer
    wSecond       As Integer
    wMilliseconds As Integer
End Type

Type BY_HANDLE_FILE_INFORMATION
    dwFileAttributes     As Long
    ftCreationTime       As FILETIME
    ftLastAccessTime     As FILETIME
    ftLastWriteTime      As FILETIME
    dwVolumeSerialNumber As Long
    nFileSizeHigh        As Long
    nFileSizeLow         As Long
    nNumberOfLinks       As Long
    nFileIndexHigh       As Long
    nFileIndexLow        As Long
End Type

' 指定したファイルをオープンし、デバイスハンドルを返す
Declare Function Api_CreateFile& Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName$, ByVal dwDesiredAccess&, ByVal dwShareMode&, lpSecurityAttributes As Any, ByVal dwCreationDisposition&, ByVal dwFlagsAndAttributes&, ByVal hTemplateFile&)

' 指定されたファイルに関する情報を取得
Declare Function Api_GetFileInformationByHandle& Lib "kernel32" Alias "GetFileInformationByHandle" (ByVal hFile&, lpFileInformation As BY_HANDLE_FILE_INFORMATION)

' オープンされているオブジェクトハンドルをクローズ
Declare Function Api_CloseHandle& Lib "kernel32" Alias "CloseHandle" (ByVal hObject&)

' 世界協定時刻形式ファイル時間をローカルファイル時間に変換
Declare Function Api_FileTimeToLocalFileTime& Lib "kernel32" Alias "FileTimeToLocalFileTime" (lpFileTime As FILETIME, lpLocalFileTime As FILETIME)

' ファイルタイムをシステムタイムに変換
Declare Function Api_FileTimeToSystemTime& Lib "kernel32" Alias "FileTimeToSystemTime" (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME)

Var Shared FileName As String

Var Shared Text1 As Object
Var Shared Edit1 As Object
Var Shared List1 As Object
Var Shared Button1 As Object

Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14
Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14
List1.Attach GetDlgItem("List1") : List1.SetFontSize 14 : List1.SetWindowSize 290, 74
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Edit1.SetWindowText "ファイルをドラッグ&ドロップしてください"
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var hFile As Long
    Var sa As SECURITY_ATTRIBUTES
    Var bhfi As BY_HANDLE_FILE_INFORMATION
    Var ft As FILETIME
    Var st As SYSTEMTIME
    Var txt As String
    Var Ret As Long

    'リストボックスを初期化
    List1.ResetContent

    'ファイル名を表示
    Edit1.SetWindowText FileName

    'セキュリティ構造体を初期化
    sa.nLength = Len(sa)

    'ファイルをオープン
    hFile = Api_CreateFile(FileName, GENERIC_READ, 0, sa, OPEN_EXISTING, 0, 0)

    'ファイルハンドルの値が有効であるとき
    If hFile <> INVALID_HANDLE_VALUE Then
        'ファイルに関する情報を取得
        Ret = Api_GetFileInformationByHandle(hFile, bhfi)

        'ファイルに関する情報を表示
        If bhfi.dwFileAttributes And FILE_ATTRIBUTE_READONLY Then
            List1.AddString "属性 :" & "ReadOnly"
        End If

        If bhfi.dwFileAttributes And FILE_ATTRIBUTE_HIDDEN Then
            List1.AddString "属性 :" & "Hidden"
        End If

        If bhfi.dwFileAttributes And FILE_ATTRIBUTE_SYSTEM Then
            List1.AddString "属性 :" & "System"
        End If

        If bhfi.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY Then
            List1.AddString "属性 :" & "Directory"
        End If

        If bhfi.dwFileAttributes And FILE_ATTRIBUTE_ARCHIVE Then
            List1.AddString "属性 :" & "Archive"
        End If

        If bhfi.dwFileAttributes And FILE_ATTRIBUTE_NORMAL Then
            List1.AddString "属性 :" & "Normal"
        End If

        If bhfi.dwFileAttributes And FILE_ATTRIBUTE_TEMPORARY Then
            List1.AddString "属性 :" & "Temporary"
        End If

        If bhfi.dwFileAttributes And FILE_ATTRIBUTE_COMPRESSED Then
            List1.AddString "属性 :" & "Compressed"
        End If

        'ファイルサイズを表示
        List1.AddString "サイズ:" & Trim$(Format$(bhfi.nFileSizeLow, "#,###,###"))

        'ファイルの作成日時をローカルファイル日付へ変換
        Ret = Api_FileTimeToLocalFileTime(bhfi.ftCreationTime, ft)

        'ファイルの作成日時をシステムファイル日付へ変換
        Ret = Api_FileTimeToSystemTime(ft, st)

        'ファイルの作成日時を表示
        txt = "作成日:" & Trim$(Str$(st.wYear)) & "年" & Trim$(Str$(st.wMonth)) & "月" & Trim$(Str$(st.wDay)) & "日" & "(" & KMid$("日月火水木金土", st.wDayOfWeek + 1, 1) & ") "
        txt = txt & Trim$(Str$(st.wHour)) & "時" & Trim$(Str$(st.wMinute)) & "分" & Trim$(Str$(st.wSecond)) & "秒"
        List1.AddString txt

        'ファイルの更新日時をローカルファイル日付へ変換
        Ret = Api_FileTimeToLocalFileTime(bhfi.ftLastWriteTime, ft)

        'ファイルの更新日時をシステムファイル日付へ変換
        Ret = Api_FileTimeToSystemTime(ft, st)

        txt = "更新日:" & Trim$(Str$(st.wYear)) & "年" & Trim$(Str$(st.wMonth)) & "月" & Trim$(Str$(st.wDay)) & "日" & "(" & KMid$("日月火水木金土", st.wDayOfWeek + 1, 1) & ") "
        txt = txt & Trim$(Str$(st.wHour)) & "時" & Trim$(Str$(st.wMinute)) & "分" & Trim$(Str$(st.wSecond)) & "秒"
        List1.AddString txt

        'ファイルのアクセス日時をローカルファイル日付へ変換
        Ret = Api_FileTimeToLocalFileTime(bhfi.ftLastAccessTime, ft)

        'ファイルのアクセス日時をシステムファイル日付へ変換
        Ret = Api_FileTimeToSystemTime(ft, st)

        txt = "アクセス日:" & Trim$(Str$(st.wYear)) & "年" & Trim$(Str$(st.wMonth)) & "月" & Trim$(Str$(st.wDay)) & "日" & "(" & KMid$("日月火水木金土", st.wDayOfWeek + 1, 1) & ") "
        txt = txt & Trim$(Str$(st.wHour)) & "時" & Trim$(Str$(st.wMinute)) & "分" & Trim$(Str$(st.wSecond)) & "秒"
        List1.AddString txt

        ' ファイルをクローズ
        Ret = Api_CloseHandle(hFile)
    '有効でないとき
    Else
        'エラーを表示
        List1.AddString "ファイルを開けませんでした。"
    End If
End Sub

'================================================================
'= シェルドロップされたファイル名を取得
'================================================================
Declare Sub Edit1_DropFiles edecl (ByVal DF As Long)
Sub Edit1_DropFiles(ByVal DF As Long)
    Var CN As Long

    CN = GetDropFileCount(DF)
    FileName = GetDropFileName(DF, 0)
    Edit1.SetWindowText FileName
End Sub
'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End