ファイルのタイムスタンプを設定          <TOP>


ファイルのタイムスタンプを設定します。

CreateFile ファイルなどの作成やオープンや切り捨てを行う

CloseHandle オープンされているオブジェクトハンドルをクローズ

GetSystemTime システムの現在の日付と時刻を取得

SystemTimeToFileTime システム時間をファイル時間に変換

SetFileTime ファイルの作成日時などを設定

 

ファイルオープンダイアログでファイルを選択、「日時設定」で作成日時を現在時間に書き換えています。

結果をプロパティで確認しています。SysTimeは世界標準時なので日本時間に変換(+9時間)しています。
 

Ret = Api_SystemTimeToFileTime(SysTime, CreateTime)  作成日時
Ret = Api_SystemTimeToFileTime(SysTime, AccsessTime)
 アクセス日時
Ret = Api_SystemTimeToFileTime(SysTime, WriteTime)  更新日時 

 

'================================================================
'= ファイルのタイムスタンプを設定
'=    (SetFileTime.bas)
'================================================================
#include "Windows.bi"

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

#define INVALID_HANDLE_VALUE (-1)      ' ファイルハンドルの値が無効であることを示す定数の宣言
#define GENERIC_WRITE &H40000000       ' オブジェクトへのアクセスの種類を指定する定数の宣言
#define OPEN_EXISTING 3                ' ファイルへの動作を指定する定数の宣言

' ファイルなどの作成やオープンや切り捨てを行う関数の宣言
Declare Function Api_CreateFile& Lib "kernel32" Alias "CreateFileA" (ByVal lFileName$, ByVal dDesiredAccess&, ByVal dShareMode&, lSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dCreationDisposition&, ByVal dFlagsAndAttributes&, ByVal hTemplateFile&)

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

' 日付と時刻を定義する構造体
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

' システムの現在の日付と時刻を取得する関数の宣言
Declare Sub Api_GetSystemTime Lib "kernel32" Alias "GetSystemTime" (lpSystemTime As SYSTEMTIME)

' ファイル時間を定義する構造体
Type FILETIME
    dwLowDateTime  As Long
    dwHighDateTime As Long
End Type

' システム時間をファイル時間に変換する関数の宣言
Declare Function Api_SystemTimeToFileTime& Lib "kernel32" Alias "SystemTimeToFileTime" (lpSystemTime As SYSTEMTIME, lpFileTime As FILETIME)

' ファイルの作成日時などを設定する関数の宣言
Declare Function Api_SetFileTime& Lib "kernel32" Alias "SetFileTime" (ByVal hFile&, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME)

Var Shared Edit1 As Object
Var Shared Text3 As Object

Edit1.Attach GetDLgItem("Edit1") : Edit1.SetFontSize 14
Text3.Attach GetDLgItem("Text3") : Text3.SetFontSize 14

Var Shared FileName As String

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    FileName = WinOpenDlg("ファイルのオープン", "*.*", "全てのファイル(*.*)", 0)
    If FileName <> Chr$(&H1B) Then
        Edit1.SetWindowText FileName
    End If
End Sub

'================================================================
'=
'================================================================
Declare Sub Button2_on edecl ()
Sub Button2_on()
    Var FileHandle As Long
    Var SecAttr As SECURITY_ATTRIBUTES
    Var SysTime As SYSTEMTIME
    Var LocalTime As SYSTEMTIME
    Var CreateTime As FILETIME
    Var AccessTime As FILETIME
    Var WriteTime As FILETIME
    Var ymd As String
    Var hms As String
    Var Ret As Long

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

    'ファイルをオープン
    FileHandle = Api_CreateFile(FileName, GENERIC_WRITE, 0, SecAttr, OPEN_EXISTING, 0, 0)

    'ファイルハンドルの値が有効であるときは
    If FileHandle <> INVALID_HANDLE_VALUE Then
        'システムの日時を取得
        Api_GetSystemTime SysTime 

        'ローカルの日時を表示
        ymd = Trim$(Str$(SysTime.wYear)) & "/" & Right$(Str$(100 + SysTime.wMonth), 2) & "/" & Right$(Str$(100 + SysTime.wDay), 2)

        'SysTime(GMT)を日本時間(JMT:Hour)に変換
        If SysTime.wHour < 16 Then Hour = SysTime.wHour + 9 Else Hour = SysTime.wHour - 15
        hms = Right$(Str$(100 + Hour), 2) & ":" & Right$(Str$(100 + SysTime.wMinute), 2) & ":" & Right$(Str$(100 + SysTime.wSecond), 2)
        Text3.SetWindowText ymd & " " & hms

        'システム時間をファイル時間に変換      ↓CreateTime:作成日時/AccsessTime:アクセス日時/WriteTime:更新日時
        Ret = Api_SystemTimeToFileTime(SysTime, CreateTime)

        'ファイルの作成日時を設定
        Ret = Api_SetFileTime(FileHandle, CreateTime, AccessTime, WriteTime)

        'ファイルをクローズ
        Ret = Api_CloseHandle(FileHandle)
    End If

End Sub

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