ファイル時間を変更する #uwsc

ファイルの作成日時とか更新日時とかを変更したいことがあるよね

ここで使ってるwinapi関数に渡す構造体のメンバが全部dwordだったり全部wordだったりだったので、これってdef_dllするときに素直に{}展開しないでvar配列でいいんじゃないかなー
と思いついたのでその実験をしている

option defaultfont = "MS ゴシック"

file = input("ファイルを指定")
if length(file) = 0 then exit

hnd = CreateFileA(file, GENERIC_READ or GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
if hnd
    dim CreationTime[1], LastAccessTime[1], LastWriteTime[1], NewFileTime[1]
    while true
        if GetFileTime(hnd, CreationTime, LastAccessTime, LastWriteTime) then
            strCreationTime = FileTimeToDateTimeString(CreationTime)
            strLastAccessTime = FileTimeToDateTimeString(LastAccessTime)
            strLastWriteTime = FileTimeToDateTimeString(LastWriteTime)
            ct  = "  作成日時:" + strCreationTime
            lat = "アクセス日時:" + strLastAccessTime
            lwt = "  更新日時:" + strLastWriteTime
            select slctbox(SLCT_BTN, 0, file, ct, lat, lwt)
                case SLCT_1
                    newTimeString = input("作成日時を変更", strCreationTime)
                    b = DateTimeStringToFileTime(newTimeString, CreationTime)
                case SLCT_2
                    newTimeString = input("アクセス日時を変更", strLastAccessTime)
                    b = DateTimeStringToFileTime(newTimeString, LastAccessTime)
                case SLCT_3
                    newTimeString = input("更新日時を変更", strLastWriteTime)
                    b = DateTimeStringToFileTime(newTimeString, LastWriteTime)
                default
                    break
            selend
            if b then
                if ! SetFileTime(hnd, CreationTime, LastAccessTime, LastWriteTime) then
                    msgbox("変更出来ませんでした")
                endif
            else
                msgbox("不正な値です<#CR>" + newTimeString)
            endif
        else
            msgbox("ファイル日時の取得に失敗")
            break
        endif
    wend
    CloseHandle(hnd)
else
    msgbox("ファイルを開けませんでした<#CR>" + file)
endif

def_dll SetFileTime(dword, var dword[], var dword[], var dword[]):long:kernel32
def_dll GetFileTime(dword, var dword[], var dword[], var dword[]):long:kernel32
def_dll FileTimeToSystemTime(var dword[], var word[]):long:kernel32
def_dll SystemTimeToFileTime(var word[], var dword[]):long:kernel32
def_dll FileTimeToLocalFileTime(var dword[], var dword[]):long:kernel32
def_dll LocalFileTimeToFileTime(var dword[], var dword[]):long:kernel32

def_dll GetFileAttributesA(var string):dword:kernel32
def_dll CreateFileA(var string, dword, dword, dword, dword, dword, dword):dword:kernel32
def_dll CloseHandle(dword):long:kernel32
const GENERIC_READ          = $80000000
const GENERIC_WRITE         = $40000000
const OPEN_EXISTING         = $3
const FILE_ATTRIBUTE_NORMAL = $80

function DateTimeStringToFileTime(strTime, var FileTime[])
    dim time[7], LocalFileTime[1]
    time[2] = 0
    i = 0
    while length(strTime) or i < length(time)
        time[i] = val( token("/ :.", strTime, true) )
        i = i + 1
        if i = 2 then i = i + 1
    wend
    
    result = false
    if SystemTimeToFileTime(time, LocalFileTime) then
        result = LocalFileTimeToFileTime(LocalFileTime, FileTime)
    endif
fend

function FileTimeToDateTimeString(FileTime[])
    dim LocalFileTime[1], SystemTime[7]
    if FileTimeToLocalFileTime(FileTime, LocalFileTime) then 
        if FileTimeToSystemTime(LocalFileTime, SystemTime) then
        
            year    = format(SystemTime[0], 4)
            month   = replace(format(SystemTime[1], 2), " ", "0")
            date    = replace(format(SystemTime[3], 2), " ", "0")
            hour    = format(SystemTime[4], 2)
            minute  = replace(format(SystemTime[5], 2), " ", "0")
            second  = replace(format(SystemTime[6], 2), " ", "0")
            milli   = replace(format(SystemTime[7], 4), " ", "0")
            
            result = year + "/" + month + "/" + date + " " + hour + ":" + minute + ":" + second + "." + milli
        else
            result = ""
        endif
    else
        result = ""
    endif
fend

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中