ファイルサイズの取得          <TOP>


ファイルサイズを取得します。

GetFileType オープンしているファイルのタイプを取得

CreateFile 指定したファイルをオープンし、デバイスハンドルを返す

GetFileSizeEx ファイルサイズの取得(64bit関数であり、F-BASICにはCurrencyがないので、ULARGE_INTEGER構造体によりHigh、Lowに分けて取り出します。)

CloseHandle 開かれているオブジェクトハンドルを閉じる

 

ファイル選択ボタンでファイルのオープンダイアログを呼び出し、ファイルを選択します。

 

選択されたファイルサイズを表示します。

 

'================================================================
'= ファイルサイズの取得
'=    (GetFileSizeEx.bas)
'================================================================
#include "Windows.bi"

Type ULARGE_INTEGER
    LowPart  As Long
    HighPart As Long
End Type

' オープンしているファイルのタイプを取得
Declare Function Api_GetFileType& Lib "kernel32" Alias "GetFileType" (ByVal hFile&)

' 指定したファイルをオープンし、デバイスハンドルを返す
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_GetFileSizeEx& Lib "kernel32" Alias "GetFileSizeEx" (ByVal hFile&, lpFileSize As ULARGE_INTEGER)

' 開かれているオブジェクトハンドルを閉じる
Declare Function Api_CloseHandle& Lib "kernel32" Alias "CloseHandle" (ByVal hObject&)

#define GENERIC_READ -2147483648        '&H80000000
#define FILE_SHARE_READ &H1             '後続のオープン操作で読み取りアクセスが要求された場合、そのオープンを許可
#define FILE_Type_CHAR &H2              'キャラクタ型デバイス
#define FILE_Type_DISK &H1              'ディスクファイル
#define FILE_Type_PIPE &H3              'パイプ
#define FILE_Type_UNKNOWN &H0           '不明
#define OPEN_EXISTING 3                 'ファイルをオープンする

Var Shared Text(5) As Object
For i = 0 To 5
    Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1)))
Next

Var Shared sFile As String

'================================================================
'=
'================================================================
Declare Sub FileSizeGet edecl ()
Sub FileSizeGet()
    Var hFile As Long
    Var nSize As ULARGE_INTEGER
    Var sSave As String
    Var Ret As Long

    'ファイルを開く
    hFile = Api_CreateFile(sFile, GENERIC_READ, FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, ByVal 0&, ByVal 0&)

    'ファイルサイズ取得
    Ret = Api_GetFileSizeEx(hFile, nSize)

    'ファイルの種類を検索
    Select Case Api_GetFileType(hFile)
        Case FILE_Type_UNKNOWN
            sSave = "指定されたファイルのタイプは未知です。"
        Case FILE_Type_DISK
            sSave = "指定されたファイルはディスクファイルです。"
        Case FILE_Type_CHAR
            sSave = "指定されたファイルは、キャラクタファイル、通常LPTデバイスまたはコンソールです。"
        Case FILE_Type_PIPE
            sSave = "指定されたファイルは命名されたか匿名のパイプです。"
    End Select

    'ファイルを閉じる
    Ret = Api_CloseHandle(hFile)

    Text(4).SetWindowText Format$((nSize.HighPart * 2 ^ 32 + nSize.LowPart) / (1000 ^ 2) * 1000000, "###,###,###") & " bytes"
    Text(5).SetWindowText sSave
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    For i = 3 To 5
        Text(i).SetWindowText ""
    Next

    sFile = WinOpenDlg("ファイルのオープン", "C:\*.*", "全てのファイル(*.*)", 0)
    If sFile <> Chr$(&H1B) Then
        Text(3).SetWindowText sFile
        FileSizeGet
    End If
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End