|
|
2008/7/17(Thu) 11:04:59|NO.17347
表題の通り、ファイルではなくフォルダーのタイムスタンプ取得がしたいのです。
|
|
2008/7/17(Thu) 18:00:52|NO.17348
Win32APIのGetFileTime関数を使えばできるんですが、ちとややこしいのでサンプルを。
駆け足で作ったので、どこかおかしい箇所があるかも。。。
#module
#uselib "kernel32.dll"
#cfunc CreateFile "CreateFileA" sptr, int, int, int, int, int, int
#func GetFileTime "GetFileTime" int, int, int, int
#func CloseHandle "CloseHandle" int
#func FileTimeToSystemTime "FileTimeToSystemTime" int, int
#const GENERIC_READ $80000000
#const FILE_SHARE_READ $00000001
#const OPEN_EXISTING $00000003
#const FILE_FLAG_BACKUP_SEMANTICS $02000000
#const INVALID_HANDLE_VALUE $FFFFFFFF
#deffunc _fxtget str folderName, array variable
hFile = CreateFile(folderName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,0)
if hFile ! INVALID_HANDLE_VALUE {
dim CreationTime, 4 ; 作成日時
dim LastAccessTime, 4 ; 最終アクセス日時
dim LastWriteTime, 4 ; 最終更新日時
GetFileTime hFile, varptr(CreationTime), varptr(LastAccessTime), varptr(LastWriteTime)
CloseHandle hFile
dim SystemTime, 4
FileTimeToSystemTime varptr(CreationTime), varptr(SystemTime)
repeat 8
variable(cnt) = wpeek(SystemTime,cnt*2)
loop
dim SystemTime, 4
FileTimeToSystemTime varptr(LastWriteTime), varptr(SystemTime)
repeat 8
variable(8+cnt) = wpeek(SystemTime,cnt*2)
loop
dim SystemTime, 4
FileTimeToSystemTime varptr(LastAccessTime), varptr(SystemTime)
repeat 8
variable(16+cnt) = wpeek(SystemTime,cnt*2)
loop
return 0
} else {
return 1
}
#global
////////////////以下サンプル////////////////
folderName = "C:\\temp\\" ; フォルダ名を指定する
dim timeStamp, 24 ; 配列の確保を忘れずに
_fxtget folderName, timeStamp ; fxtget命令と同じように使える
if stat = 0 {
pos 0, 0
mes folderName
pos 0, 36
mes "作成日時"
mes " 年 : " + timeStamp(0)
mes " 月 : " + timeStamp(1)
mes " 曜日 : " + timeStamp(2)
mes " 日 : " + timeStamp(3)
mes " 時 : " + timeStamp(4)
mes " 分 : " + timeStamp(5)
mes " 秒 : " + timeStamp(6)
mes " ミリ秒 : " + timeStamp(7)
pos 160, 36
mes "最終更新日時"
mes " 年 : " + timeStamp(8)
mes " 月 : " + timeStamp(9)
mes " 曜日 : " + timeStamp(10)
mes " 日 : " + timeStamp(11)
mes " 時 : " + timeStamp(12)
mes " 分 : " + timeStamp(13)
mes " 秒 : " + timeStamp(14)
mes " ミリ秒 : " + timeStamp(15)
pos 320, 36
mes "最終アクセス日時"
mes " 年 : " + timeStamp(16)
mes " 月 : " + timeStamp(17)
mes " 曜日 : " + timeStamp(18)
mes " 日 : " + timeStamp(19)
mes " 時 : " + timeStamp(20)
mes " 分 : " + timeStamp(21)
mes " 秒 : " + timeStamp(22)
mes " ミリ秒 : " + timeStamp(23)
} else {
pos 0, 0
mes folderName
pos 0, 36
mes "タイムスタンプの取得に失敗しました"
}
参考URL
http://m--takahashi.com/bbs/pastlog/03500/03495.html
その他、MSDNの各API該当ページ

| |
|
2008/7/17(Thu) 18:34:57|NO.17350
ゲッゲッ!こんなにやっかいなことになるんですか。
教えていただいたのをコピーしてテストしてみます。
解決のチェックはその後に。
|
|
2008/7/17(Thu) 18:56:39|NO.17351
テストしてみたのですが、作成日もアクセス日も、フォルダーのプロパティとは9時間の差が出るんです。
|
|
2008/7/17(Thu) 19:47:45|NO.17352
|
|
2008/7/17(Thu) 20:32:13|NO.17354
ああすいませんすいませんすいません
やはり詰めが甘かったようです。
FileTimeToLocalFileTime関数のことは調べがついていたはずなのに、
モジュールに組み込むのを忘れていました。
というわけでモジュール差し替え↓
#module
#uselib "kernel32.dll"
#cfunc CreateFile "CreateFileA" sptr, int, int, int, int, int, int
#func GetFileTime "GetFileTime" int, int, int, int
#func CloseHandle "CloseHandle" int
#func FileTimeToLocalFileTime "FileTimeToLocalFileTime" int, int
#func FileTimeToSystemTime "FileTimeToSystemTime" int, int
#const GENERIC_READ $80000000
#const FILE_SHARE_READ $00000001
#const OPEN_EXISTING $00000003
#const FILE_FLAG_BACKUP_SEMANTICS $02000000
#const INVALID_HANDLE_VALUE $FFFFFFFF
#deffunc _fxtget str folderName, array variable
hFile = CreateFile(folderName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,0)
if hFile ! INVALID_HANDLE_VALUE {
dim CreationTime, 4 ; 作成日時
dim LastAccessTime, 4 ; 最終アクセス日時
dim LastWriteTime, 4 ; 最終更新日時
GetFileTime hFile, varptr(CreationTime), varptr(LastAccessTime), varptr(LastWriteTime)
CloseHandle hFile
dim LocalFileTime, 4
FileTimeToLocalFileTime varptr(CreationTime), varptr(LocalFileTime)
dim SystemTime, 4
FileTimeToSystemTime varptr(LocalFileTime), varptr(SystemTime)
repeat 8
variable(cnt) = wpeek(SystemTime,cnt*2)
loop
dim LocalFileTime, 4
FileTimeToLocalFileTime varptr(LastWriteTime), varptr(LocalFileTime)
dim SystemTime, 4
FileTimeToSystemTime varptr(LocalFileTime), varptr(SystemTime)
repeat 8
variable(8+cnt) = wpeek(SystemTime,cnt*2)
loop
dim LocalFileTime, 4
FileTimeToLocalFileTime varptr(LastAccessTime), varptr(LocalFileTime)
dim SystemTime, 4
FileTimeToSystemTime varptr(LocalFileTime), varptr(SystemTime)
repeat 8
variable(16+cnt) = wpeek(SystemTime,cnt*2)
loop
return 0
} else {
return 1
}
#global
本当にFileTimeToLocalFileTime関数を組み込んだだけなので、
汚いのは変わってませんが……。

| |
|
2008/7/18(Fri) 08:22:58|NO.17367
おお!ありがとうございます。ばっちり作成日が表示されます。
これで次に進めます。とてもお世話になりました。
こういうことが自分でもできるようになりたい。
|
|
2008/8/25(Mon) 15:57:27|NO.18684
あれ?
hspext.asで出来なかったっけ?
|
|