HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0522
こいるGetFileTime関数の使い方を教えてください4解決


こいる

リンク

2020/5/22(Fri) 21:12:30|NO.90613

GetFileTime関数を使って、ファイルの作成日時を取得したいです。

いろいろ調べてやってみたのですが、うまくいきません。
どうすればうまくいくのでしょうか?

#uselib "kernel32.dll" #func CreateFile "CreateFileA" sptr,sptr,sptr,sptr,sptr,sptr,sptr #define GENERIC_READ $80000000 #define FILE_SHARE_READ $00000001 #define OPEN_EXISTING $00000003 #define FILE_ATTRIBUTE_NORMAL $00000080 #func GetFileTime "GetFileTime" sptr,sptr,sptr,sptr #func FileTimeToSystemTime "FileTimeToSystemTime" sptr,sptr #func CloseHandle "CloseHandle" sptr // 対象にするファイルを作成 sdim sFile notesel sFile notesave "test.txt" // アクセスできるようにする? CreateFile dir_cur+"\\test.txt", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 hFile = stat // ファイルの作成日時を取得する dim FILETIME,2 GetFileTime hFile, varptr(FILETIME), 0, 0 if stat{ // システム時刻に変換する dim SYSTEMTIME,8 FileTimeToSystemTime varptr(FILETIME), varptr(SYSTEMTIME) repeat 8 mes strf("%d:%d", cnt, SYSTEMTIME.cnt) loop } CloseHandle hFile // ハンドルを閉じる



この記事に返信する


TOMATO

リンク

2020/5/22(Fri) 22:00:36|NO.90615


#uselib "kernel32.dll" #func CreateFile "CreateFileA" sptr,sptr,sptr,sptr,sptr,sptr,sptr #define GENERIC_READ $80000000 #define FILE_SHARE_READ $00000001 #define OPEN_EXISTING $00000003 #define FILE_ATTRIBUTE_NORMAL $00000080 #func GetFileTime "GetFileTime" sptr,sptr,sptr,sptr #func FileTimeToSystemTime "FileTimeToSystemTime" sptr,sptr #func CloseHandle "CloseHandle" sptr // 対象にするファイルを作成 sdim sFile notesel sFile notesave "test.txt" // アクセスできるようにする? CreateFile dir_cur+"\\test.txt", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 hFile = stat // ファイルの作成日時を取得する dim FILETIME,2 GetFileTime hFile, varptr(FILETIME), 0, 0 if stat{ // システム時刻に変換する dim SYSTEMTIME,4 FileTimeToSystemTime varptr(FILETIME), varptr(SYSTEMTIME) repeat 8 mes strf("%d:%d", cnt, wpeek(SYSTEMTIME, cnt * 2)) loop } CloseHandle hFile // ハンドルを閉じる



TOMATO

リンク

2020/5/22(Fri) 22:16:26|NO.90616

補足をしておくと、SYSTEMTIME 構造体は各メンバがWORD型なので2バイトの合計16バイトになります。
https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-systemtime

ですので、

dim SYSTEMTIME,4
でサイズがぴったりとなります。

2バイトごとにアクセスする必要があるので、wpeekを使用しています。



あらや

リンク

2020/5/22(Fri) 22:25:05|NO.90617

勝手に補足

時間がおかしいと思ったら、取得した時間がUTCになっているので

GetFileTime関数のあとに
FileTimeToLocalFileTime関数でローカル時間に修正し
ローカル時間をFileTimeToSystemTime関数に渡すと
日本時間が取得できますよ。



こいる

リンク

2020/5/23(Sat) 13:43:15|NO.90620

できました!
お二人ともありがとうございました!

// test2.txtを作成して、作成日時を取得する #uselib "kernel32.dll" #func CreateFile "CreateFileA" sptr,sptr,sptr,sptr,sptr,sptr,sptr #define GENERIC_READ $80000000 #define FILE_SHARE_READ $00000001 #define OPEN_EXISTING $00000003 #define FILE_ATTRIBUTE_NORMAL $00000080 #func GetFileTime "GetFileTime" sptr,sptr,sptr,sptr #func FileTimeToLocalFileTime "FileTimeToLocalFileTime" sptr,sptr #func FileTimeToSystemTime "FileTimeToSystemTime" sptr,sptr #func CloseHandle "CloseHandle" sptr // 対象にするファイルを作成 sdim sFile notesel sFile notesave "test2.txt" // アクセスできるようにする? CreateFile dir_cur+"\\test2.txt", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 hFile = stat // ファイルのタイムスタンプを取得する dim FILETIME,2 GetFileTime hFile, varptr(FILETIME), 0, 0 if stat{ // ローカル時間に変換する dim FILETIME_LocalTime,4 FileTimeToLocalFileTime varptr(FILETIME), varptr(FILETIME_LocalTime) // システム時間に変換する dim SYSTEMTIME,4 FileTimeToSystemTime varptr(FILETIME_LocalTime), varptr(SYSTEMTIME) // 表示 mes strf("作成日時:%d/%d/%d %d:%d", wpeek(SYSTEMTIME,0*2), wpeek(SYSTEMTIME,1*2), wpeek(SYSTEMTIME,3*2), wpeek(SYSTEMTIME,4*2), wpeek(SYSTEMTIME,5*2) ) } CloseHandle hFile // ハンドルを閉じる



ONION software Copyright 1997-2018(c) All rights reserved.