將以下內容保存為本地文件n_cst_filetime.sru,然後導入pbl中
[cpp]
$PBExportHeader$n_cst_filetime.sru
$PBExportComments$與文件時間有關的外部函數
forward
global type n_cst_filetime from nonvisualobject
end type
type os_filedatetime from structure within n_cst_filetime
end type
type os_fileopeninfo from structure within n_cst_filetime
end type
type os_finddata from structure within n_cst_filetime
end type
type os_securityattributes from structure within n_cst_filetime
end type
type os_systemtime from structure within n_cst_filetime
end type
end forward
type os_filedatetime from structure
unsignedlong ul_lowdatetime
unsignedlong ul_highdatetime
end type
type os_fileopeninfo from structure
character c_length
character c_fixed_disk
unsignedinteger ui_dos_error
unsignedinteger ui_na1
unsignedinteger ui_na2
character c_pathname[128]
end type
type os_finddata from structure
unsignedlong ul_fileattributes
os_filedatetime str_creationtime
os_filedatetime str_lastaccesstime
os_filedatetime str_lastwritetime
unsignedlong ul_filesizehigh
unsignedlong ul_filesizelow
unsignedlong ul_reserved0
unsignedlong ul_reserved1
character ch_filename[260]
character ch_alternatefilename[14]
end type
type os_securityattributes from structure
unsignedlong ul_length
string ch_description
boolean b_inherit
end type
type os_systemtime from structure
unsignedinteger ui_wyear
unsignedinteger ui_wmonth
unsignedinteger ui_wdayofweek
unsignedinteger ui_wday
unsignedinteger ui_whour
unsignedinteger ui_wminute
unsignedinteger ui_wsecond
unsignedinteger ui_wmilliseconds
end type
global type n_cst_filetime from nonvisualobject autoinstantiate
end type
type prototypes
//獲得應用程序名用
//Function uint GetModuleFileNameA(ulong hModule,ref string lpFilename,ulong nSize) Library "kernel32.dll" //獲取應用程序運行目錄
//文件操作
Function long FindFirstFileA (ref string filename, ref os_finddata findfiledata) library "kernel32.dll"
Function boolean FindNextFileA (long handle, ref os_finddata findfiledata) library "kernel32.dll"
Function boolean FindClose (long handle) library "kernel32.dll"
Function long OpenFile (ref string filename, ref os_fileopeninfo of_struct, ulong action) LIBRARY "kernel32.dll"
Function boolean CloseHandle (long file_hand) LIBRARY "kernel32.dll"
Function boolean GetFileTime(long hFile, ref os_filedatetime lpCreationTime, ref os_filedatetime lpLastAccessTime, ref os_filedatetime lpLastWriteTime ) library "kernel32.dll"
Function boolean FileTimeToSystemTime(ref os_filedatetime lpFileTime, ref os_systemtime lpSystemTime) library "kernel32.dll"
Function boolean FileTimeToLocalFileTime(ref os_filedatetime lpFileTime, ref os_filedatetime lpLocalFileTime) library "kernel32.dll"
Function boolean SetFileTime(long hFile, os_filedatetime lpCreationTime, os_filedatetime lpLastAccessTime, os_filedatetime lpLastWriteTime ) library "kernel32.dll"
Function boolean SystemTimeToFileTime(os_systemtime lpSystemTime, ref os_filedatetime lpFileTime) library "kernel32.dll"
Function boolean LocalFileTimeToFileTime(ref os_filedatetime lpLocalFileTime, ref os_filedatetime lpFileTime) library "kernel32.dll"
end prototypes
type variables
end variables
forward prototypes
public function integer of_getcreatedatetime (string as_filename, ref datetime adt)
public function integer of_getlastwritedatetime (string as_filename, ref datetime adt)
public function integer of_setlastwritedatetime (string as_filename, datetime adt)
private function integer of_convertfiledatetimetopb (os_filedatetime astr_filetime, ref datetime adt)
private function integer of_convertpbdatetimetofile (datetime adt, ref os_filedatetime astr_filetime)
end prototypes
public function integer of_getcreatedatetime (string as_filename, ref datetime adt);//得到文件創建的時間
long ll_handle
os_finddata lstr_FindData
// Get the file information
ll_handle = FindFirstFileA(as_FileName, lstr_FindData)
If ll_handle <= 0 Then Return -1
FindClose(ll_handle)
// Convert the date and time
Return of_ConvertFileDatetimeToPB(lstr_FindData.str_CreationTime, adt)
end function
public function integer of_getlastwritedatetime (string as_filename, ref datetime adt);//得到文件最後修改的時間
long ll_handle
os_finddata lstr_FindData
// Get the file information
ll_handle = FindFirstFileA(as_FileName, lstr_FindData)
If ll_handle <= 0 Then Return -1
FindClose(ll_handle)
// Convert the date and time
Return of_ConvertFileDatetimeToPB(lstr_FindData.str_LastWriteTime, adt)
end function
public function integer of_setlastwritedatetime (string as_filename, datetime adt);//設置文件最後修改時間
boolean lb_Ret
long ll_handle
os_filedatetime lstr_FileTime, lstr_Empty
os_finddata lstr_FindData
os_fileopeninfo lstr_FileInfo
// Get the file information.
// This is required to keep the Last Access date from changing.
// It will be changed by the OpenFile function.
ll_handle = FindFirstFileA(as_FileName, lstr_FindData)
If ll_handle <= 0 Then Return -1
FindClose(ll_handle)
// Convert the date and time
If of_ConvertPBDatetimeToFile(adt, lstr_FileTime) < 0 Then Return -1
// Set the file structure information
lstr_FileInfo.c_fixed_disk = "~000"
lstr_FileInfo.c_pathname = as_FileName
lstr_FileInfo.c_length = "~142"
// Open the file
ll_handle = OpenFile ( as_filename, lstr_FileInfo, 2 )
If ll_handle < 1 Then Return -1
lb_Ret = SetFileTime(ll_handle, lstr_Empty, lstr_FindData.str_LastAccessTime, lstr_FileTime)
CloseHandle(ll_handle)
If lb_Ret Then
Return 1
Else
Return -1
End If
end function
private function integer of_convertfiledatetimetopb (os_filedatetime astr_filetime, ref datetime adt);//轉換文件系統時間為PB時間
os_filedatetime lstr_LocalTime
os_systemtime lstr_SystemTime
If Not FileTimeToLocalFileTime(astr_FileTime, lstr_LocalTime) Then Return -1
If Not FileTimeToSystemTime(lstr_LocalTime, lstr_SystemTime) Then Return -1
adt = datetime(blob(String(lstr_SystemTime.ui_wyear) + "-" + &
String(lstr_SystemTime.ui_WMonth) + "-" + &
String(lstr_SystemTime.ui_WDay) + ' ' + &
String(lstr_SystemTime.ui_wHour) + ":" + &
String(lstr_SystemTime.ui_wMinute) + ":" + &
String(lstr_SystemTime.ui_wSecond) + ":" + &
String(lstr_SystemTime.ui_wMilliseconds)))
Return 1
end function
private function integer of_convertpbdatetimetofile (datetime adt, ref os_filedatetime astr_filetime);//轉換文件系統時間為PB時間
os_filedatetime lstr_LocalTime
os_systemtime lstr_SystemTime
lstr_SystemTime.ui_wyear = year(date(adt))
lstr_SystemTime.ui_WMonth = Month(date(adt))
lstr_SystemTime.ui_WDay = Day(date(adt))
lstr_SystemTime.ui_wHour = hour(time(adt))
lstr_SystemTime.ui_wMinute = Minute(time(adt))
lstr_SystemTime.ui_wSecond = Second(time(adt))
lstr_SystemTime.ui_wMilliseconds = Long(String(adt, "fff"))
If Not SystemTimeToFileTime(lstr_SystemTime, lstr_LocalTime) Then Return -1
If Not LocalFileTimeToFileTime(lstr_LocalTime, astr_FileTime) Then Return -1
Return 1
end function
on n_cst_filetime.create
call super::create
TriggerEvent( this, "constructor" )
end on
on n_cst_filetime.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on
程序中這樣調用即可:
[cpp]
n_cst_filetime ln
string ls_file = 'C:\Program Files\Sybase\PowerBuilder 9.0\pb90.exe'
datetime ldt_create, ldt_lastwrite
ln.of_getcreatedatetime( ls_file, ldt_create)
ln.of_getlastwritedatetime( ls_file, ldt_lastwrite)
messagebox('提示', '文件【' + ls_file + '】~r~n~r~n創建時間: ' + string(ldt_create, 'yyyy年mm月dd日, hh:mm:ss.fff') +&
'~r~n修改日期: ' + string(ldt_lastwrite, 'yyyy年mm月dd日, hh:mm:ss.fff') )
摘自 yyoinge的專欄