テンポラリフォルダとファイル名          <TOP>


テンポラリフォルダのファイル取得および作成

FindClose ファイルのハンドルを閉じる

CreateFile ファイルのハンドルを取得

GetFileTime ファイルのタイムスタンプを取得

FileTimeToSystemTime システムファイルタイムに変換

FileTimeToLocalFileTime ローカルタイムに変換

GetTempPath 一時フォルダ(テンポラリフォルダ)を取得

GetTempFileName 一時ファイル名取得(作成)

GetLongPathName ロングパス名を取得

 

ユニーク(一意)な名前を持つ空の一時ファイルを作成します。3文字までのプリフィクス(3文字以上の場合は先頭の3文字までが有効)と、システムが作成する最大4桁の16進数を加え、tmpという拡張子を持つファイル名が作成されます。例:xxxyyyy.tmp(xxx文字列、yyyy16進数文字列)

右:既存のファイルを一度開いてみた状態

 

テンポラリファイルは、3文字までのプリフィクスと16進数のテンポラリ番号で表される。

プリフィクスにabc、ファイル番号に0を入力した場合新たなファイルが作成されます。

 

'================================================================
'= テンポラリフォルダとファイル名
'=    (GetTempFileNam.bas)
'================================================================
#include "Windows.bi"

Type SYSTEMTIME
    wYear         As Integer                '年
    wMonth        As Integer                '月  (1月=1、2月=2・・・)
    wDayOfWeek    As Integer                '曜日 (日曜=0、月曜=1・・)
    wDay          As Integer                '日
    wHour         As Integer                '時
    wMinute       As Integer                '分
    wSecond       As Integer                '秒
    wMilliseconds As Integer                'ミリ秒
End Type

Type FILETIME
    dwLowDateTime  As Long                  '下位32ビット値
    dwHighDateTime As Long                  '上位32ビット値
End Type

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

#define GENERIC_READ -2147483648            '&H80000000
#define GENERIC_WRITE &H40000000            '
#define FILE_SHARE_READ &H1                 '後続のオープン操作で読み取りアクセスが要求された場合、そのオープンを許可
#define FILE_SHARE_WRITE &H2                '後続のオープン操作で書き込みアクセスが要求された場合、そのオープンを許可

#define CREATE_NEW 1                        '
#define CREATE_ALWAYS 2                     '
#define OPEN_EXISTING 3                     'ファイルをオープンする
#define OPEN_ALWAYS 4                       '
#define TRUNCATE_EXISTING 5                 '
#define FILE_ATTRIBUTE_ARCHIVE &H20         'アーカイブ属性を示す定数
#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      '一時ファイル属性を示す定数
#define FILE_FLAG_WRITE_THROUGH -2147483648 'キャッシュに書き込まれたデータをそのまま直接ディスクに書き込むようにする(&H8000
#define FILE_FLAG_OVERLAPPED &H40000000     '時間のかかる処理に対してReadFile関数やWriteFile関数でERROR_IO_PENDING拡張エラー・
#define FILE_FLAG_NO_BUFFERING &H20000000   'システムキャッシュを使用せずにファイルをオープンするように指定
#define FILE_FLAG_RANDOM_ACCESS &H10000000  'ファイルにランダムアクセスすることをシステムに示す
#define FILE_FLAG_SEQUENTIAL_SCAN &H8000000 'ファイルにシーケンシャルアクセスすることをシステムに示す
#define FILE_FLAG_DELETE_ON_CLOSE &H4000000 'そのファイルを指すすべてのファイルのハンドルがクローズされた時に、そのファイルを
#define FILE_FLAG_POSIX_SEMANTICS &H1000000 'POSIXの規則に従ってファイルにアクセス

' ファイルのハンドルを閉じる
Declare Function Api_FindClose& Lib "kernel32" Alias "FindClose" (ByVal hFindFile&)

' ファイルのハンドルをGET
Declare Function Api_CreateFile& Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName$, ByVal dwDesiredAccess&, ByVal dwShareMode&, ByVal lpSecurityAttributes&, ByVal dwCreationDisposition&, ByVal dwFlagsAndAttributes&, ByVal hTemplateFile&)

' ファイルスタンプを取得する
Declare Function Api_GetFileTime& Lib "kernel32" Alias "GetFileTime" (ByVal hFile&, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME)

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

' ローカルタイムに変換
Declare Function Api_FileTimeToLocalFileTime& Lib "kernel32" Alias "FileTimeToLocalFileTime" (lpFileTime As FILETIME, lpLocalFileTime As FILETIME)

' 一時フォルダ(テンポラリフォルダ)を取得
Declare Function Api_GetTempPath& Lib "Kernel32" Alias "GetTempPathA" (ByVal nBufferLength&, ByVal lpBuffer$)

' 一時ファイル名取得(作成)
Declare Function Api_GetTempFileName& Lib "kernel32" Alias "GetTempFileNameA" (ByVal lpszPath$, ByVal lpPrefixString$, ByVal wUnique&, ByVal lpTempFileName$)

' ロングパス名を取得
Declare Function Api_GetLongPathName& Lib "Kernel32" Alias "GetLongPathNameA" (ByVal lpszShortPath$, ByVal lpszLongPath$, ByVal cchBuffer&)

Var Shared Text(9) As Object
Var Shared Edit1 As Object
Var Shared Edit2 As Object

For i = 0 To 9
    Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1))) : Text(i).SetFontSize 14
Next
Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14
Edit2.Attach GetDlgItem("Edit2") : Edit2.SetFontSize 14

'================================================================
'=
'================================================================
Declare Function WeekDay(Str As Integer) As String
Function WeekDay(Str As Integer) As String
    Select Case Str
        Case 0
            WeekDay = "日"
        Case 1
            WeekDay = "月"
        Case 2
            WeekDay = "火"
        Case 3
            WeekDay = "水"
        Case 4
            WeekDay = "木"
        Case 5
            WeekDay = "金"
        Case 6
            WeekDay = "土"
    End Select
End Function

'================================================================
'=
'================================================================
Declare Function LongPathName(strShortPathName As String) As String
Function LongPathName(strShortPathName As String) As String
    Var Buffer As String
    Var Ret As Long

    Buffer = String$(256, Chr$(0))
    On Error Goto *LongPathName_Error

    Ret = Api_GetLongPathName(strShortPathName, Buffer, Len(Buffer))
    On Error Goto 0
    ' 不正パスはNullを返す
    If Ret > 0 Then
        LongPathName = Left$(Buffer, InStr(Buffer, Chr$(0)) - 1)
    Else
        LongPathName = Chr$(0)
    End If
    Exit Function

'GetLongPathName未実装対策(For Windows95,WindowsNT4.0)
*LongPathName_Error
    LongPathName = strShortPathName
End Function

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var lpCreationTime As FILETIME
    Var lpLastAccessTime As FILETIME
    Var lpLastWriteTime As FILETIME
    Var lpLocalFileTime As FILETIME
    Var lpSystemTime As SYSTEMTIME
    Var Buffer As String * 256                '文字列バッファ
    Var Prefix As String                      'プリフィクス(3文字まで)
    Var FileNo As Long                        'テンポラリファイル番号
    Var TempP As String                       'テンポラリパス
    Var TempN As String                       'テンポラリファイル名
    Var TempL As String
    Var RetVal As Long
    Var Ret As Long
    
    'プリフィクス取得
    Prefix = Edit1.GetWindowText

    'テンポラリファイル番号
    FileNo = Val("&H" & EDit2.GetWindowText)

    'テンポラリパス取得
    Ret = Api_GetTempPath(256, Buffer)
    TempP = Left$(Buffer, Ret)
    
    'テンポラリファイル名取得
    Ret = Api_GetTempFileName(TempP, Prefix, FileNo, Buffer)
    TempN = Left$(Buffer, InStr(Buffer, Chr$(0)) - 1)
    Text(0).SetWindowText TempN

    TempL = LongPathName(TempN)
    Text(1).SetWindowText TempL

   'ファイルのハンドル取得する
    Ret = Api_CreateFile(TempL, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)

    If Ret <> -1 Then

        'ファイルスタンプを取得する
        RetVal = Api_GetFileTime(Ret, lpCreationTime, lpLastAccessTime, lpLastWriteTime)

        If RetVal <> 0 Then

            'ファイルの新規作成日を取得
            RetVal = Api_FileTimeToLocalFileTime(lpCreationTime, lpLocalFileTime)

            'システムタイムに変換
            RetVal = Api_FileTimeToSystemTime(lpLocalFileTime, lpSystemTime)

            If RetVal <> 0 Then
                ymd$ = Trim$(Str$(lpSystemTime.wYear)) & "/" & Right$(Str$(100 + lpSystemTime.wMonth), 2) & "/" & Right$(Str$(100 + lpSystemTime.wDay), 2) & " "
                hms$ = Right$(Str$(100 + lpSystemTime.wHour), 2) & ":" & Right$(Str$(100 + lpSystemTime.wMinute), 2) & ":" & Right$(Str$(100 + lpSystemTime.wSecond), 2) & " "
                week$ = "(" & WeekDay(lpSystemTime.wDayOfWeek) & ")"
                Text(2).SetWindowText ymd$ & hms$ & week$
            End If

            '最終アクセス日を取得
            RetVal = Api_FileTimeToLocalFileTime(lpLastAccessTime, lpLocalFileTime)

            'システムタイムに変換
            RetVal = Api_FileTimeToSystemTime(lpLocalFileTime, lpSystemTime)

            If RetVal <> 0 Then
                ymd$ = Trim$(Str$(lpSystemTime.wYear)) & "/" & Right$(Str$(100 + lpSystemTime.wMonth), 2) & "/" & Right$(Str$(100 + lpSystemTime.wDay), 2) & " "
                hms$ = Right$(Str$(100 + lpSystemTime.wHour), 2) & ":" & Right$(Str$(100 + lpSystemTime.wMinute), 2) & ":" & Right$(Str$(100 + lpSystemTime.wSecond), 2) & " "
                week$ = "(" & WeekDay(lpSystemTime.wDayOfWeek) & ")"
                Text(3).SetWindowText ymd$ & hms$ & week$
            End If

            'ファイルの最終更新日を取得
            RetVal = Api_FileTimeToLocalFileTime(lpLastWriteTime, lpLocalFileTime)

            'システムタイムに変換
            RetVal = Api_FileTimeToSystemTime(lpLocalFileTime, lpSystemTime)

            If RetVal <> 0 Then
                ymd$ = Trim$(Str$(lpSystemTime.wYear)) & "/" & Right$(Str$(100 + lpSystemTime.wMonth), 2) & "/" & Right$(Str$(100 + lpSystemTime.wDay), 2) & " "
                hms$ = Right$(Str$(100 + lpSystemTime.wHour), 2) & ":" & Right$(Str$(100 + lpSystemTime.wMinute), 2) & ":" & Right$(Str$(100 + lpSystemTime.wSecond), 2) & " "
                week$ = "(" & WeekDay(lpSystemTime.wDayOfWeek) & ")"
                Text(4).SetWindowText ymd$ & hms$ & week$
            End If
        End If
    End If

    Ret = Api_FindClose(Ret)
End Sub

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