$PBExportHeader$nvo_directory.sru
$PBExportComments$目录操作类
forward
global type nvo_directory from nonvisualobject
end type
type stc_filetime from structure within nvo_directory
end type
type stc_fileopstruct from structure within nvo_directory
end type
type stc_browseinfo from structure within nvo_directory
end type
type stc_find_data from structure within nvo_directory
end type
type large_integer from structure within nvo_directory
end type
type stc_ofstruct from structure within nvo_directory
end type
type shfileopstruct from structure within nvo_directory
end type
end forward
type stc_filetime from structure
unsignedlong l_time
unsignedlong h_time
end type
type stc_fileopstruct from structure
unsignedlong hwnd
unsignedlong wfunc
string pfrom
string pto
long fflags
long fanyoperationsaborted
long hnamemappings
string lpszprogresstitle
end type
type stc_browseinfo from structure
long hwndowner
long pidlroot
string pszdisplayname
string lpsztitle
unsignedlong ulflags
unsignedlong lpfn
unsignedlong lparam
long iimage
end type
type stc_find_data from structure
unsignedlong att
stc_filetime c_time
stc_filetime a_time
stc_filetime w_time
unsignedlong h_size
unsignedlong l_size
unsignedlong dwreserved0
unsignedlong dwreserved1
character cfilename[260]
character calternatefilename[16]
end type
type large_integer from structure
unsignedlong lowpart
unsignedlong highpart
end type
type stc_ofstruct from structure
character cbytes
character ffixeddisk
long nerrcode
long reserved1
long reserved2
character szpathname[128]
end type
type shfileopstruct from structure
long hwnd
unsignedlong wfunc
long pfrom
string pto
unsignedlong fflags
boolean fanyoperationsaborted
long hnamemappings
string lpszprogresstitle
end type
global type nvo_directory from nonvisualobject autoinstantiate
end type
type prototypes
FUNCTION ulong GetCurrentDirectoryA(ulong BufferLen,ref string currentdir)LIBRARY "kernel32.dll"
FUNCTION ulong SetCurrentDirectory(ref string lpPathName) LIBRARY "kernel32.dll" ALIAS FOR "SetCurrentDirectoryA"
Function uLong GetModuleFileNameA(long hinstModule, Ref String lpszPath, uLong cchPath) Library "kernel32.dll"
FUNCTION ulong GetTempPath(ulong nBufferLength,ref string lpBuffer) LIBRARY "kernel32.dll" ALIAS FOR "GetTempPathA"
Function boolean CreateDirectoryA(string lpPathName,string lpSecurityAttributes) Library "kernel32.dll"
Function boolean RemoveDirectoryA(string lpPathName) Library "kernel32.dll"
Function ulong GetTempPathA(ulong nBufferLength,ref string lpBuffer) Library "kernel32.dll"
Function uint GetWindowsDirectoryA(ref string lpBuffer,uint uSize) Library "kernel32.dll"
Function uint GetSystemDirectoryA(ref string lpBuffer,uint uSize) Library "kernel32.dll"
Function uint GetDriveTypeA(string lpRootPathName) LIBRARY "kernel32.dll"
FUNCTION ulong FindClose(ulong hFindFile) LIBRARY "kernel32.dll"
FUNCTION ulong FindFirstFile(ref string lpFileName,ref stc_FIND_DATA lpFindFileData) LIBRARY "kernel32.dll" ALIAS FOR "FindFirstFileA"
FUNCTION ulong FindNextFile(ulong hFindFile,ref stc_FIND_DATA lpFindFileData) LIBRARY "kernel32.dll" ALIAS FOR "FindNextFileA"
FUNCTION ulong SetFileAttributes(ref string lpFileName,ulong dwFileAttributes) LIBRARY "kernel32.dll" ALIAS FOR "SetFileAttributesA"
FUNCTION boolean DeleteFileA(ref string filename)LIBRARY "Kernel32.DLL"
Function boolean GetDiskFreeSpaceA(string lpRootPathName,ref ulong lpSectorsPerCluster,ref ulong lpBytesPerSector,ref ulong lpNumberOfFreeClusters,ref ulong lpTtoalNumberOfClusters) LIBRARY "kernel32.dll"
Function boolean GetVolumeInformationA(string lpRootPathName,ref string lpVolumeNameBuffer,ulong nVolumeNameSize,ref ulong lpVolumeSerialNumber,ref ulong lpMaximumComponentLength,ref ulong lpFileSystemFlags,ref string lpFileSystemNameBuffer,ulong nFileSystemNameSize) LIBRARY "kernel32.dll"
Function long SHFileOperation( stc_fileopstruct lpFileOp) Library "Shell32.dll" Alias for "SHFileOperationA"
Function long SHBrowseForFolder( Ref stc_BROWSEINFO lpBi ) Library "shell32.dll"
Function boolean SHGetPathFromIDList( long pIDL, Ref String pszPath ) Library "shell32.dll" Alias For "SHGetPathFromIDListA"
FUNCTION ulong WNetAddConnection(ref string lpszNetPath,ref string lpszPassword,ref string lpszLocalName) LIBRARY "mpr.dll" ALIAS FOR "WNetAddConnectionA"
FUNCTION ulong WNetCancelConnection(ref string lpszName,boolean bForce) LIBRARY "mpr.dll" ALIAS FOR "WNetCancelConnectionA"
Function long SHFormatDrive( ulong hWnd, ulong iDrive, ulong iCapacity, ulong iType ) Library "shell32.dll"
function long MyZip_AddDirectory(ref string SrcPath,ref string ZipFile) library "myzip.dll"
function long MyZip_ExtractFileAll(ref string zipfile,ref string pathname) library "myzip.dll"
Function boolean EncryptFile (ref string lpFileName)Library "ADVAPI32.dll" Alias for "EncryptFileA"
Function boolean DecryptFile(ref string lpFileName, long dwReserved ) Library "ADVAPI32.dll" Alias for "DecryptFileA"
Function boolean MoveFileA(ref string lpExistingFileName,ref string lpNewFileName) LIBRARY "kernel32.dll"
Function long GetDiskFreeSpaceExA(ref string lpRootPathName, ref large_integer lpFreeBytesAvailableToCaller,ref large_integer lpTotalNumberOfBytes, ref large_integer lpTotalNumberOfFreeBytes) Library "kernel32.dll"
Function long GetFileAttributes (string lpFileName ) Library "kernel32.dll" Alias for "GetFileAttributesA"
FUNCTION ulong FileTimeToDosDateTime(ref Stc_FILETIME lpFileTime,ref long lpFatDate,ref long lpFatTime) LIBRARY "kernel32.dll"
FUNCTION ulong DosDateTimeToFileTime(ulong wFatDate,ulong wFatTime,ref Stc_FILETIME lpFileTime) LIBRARY "kernel32.dll"
Function long GetLogicalDriveStrings(long nBufferLength, ref blob lpBuffer ) Library "kernel32.dll" Alias for "GetLogicalDriveStringsA"
Function long SHFileOperation( Ref SHFILEOPSTRUCT lpFileOp ) Library "shell32.dll" Alias For "SHFileOperationA"
Function long RtlMoveMemory(REF Char Destination[], long Source, long Size) library "kernel32"
Function long RtlMoveMemory(long Destination, REF Char Source[], long Size) library "kernel32"
Function long LocalAlloc(long Flags, long Bytes) library "kernel32"
Function long LocalFree(long MemHandle) library "kernel32"
end prototypes
type variables
private:
string is_subdirs[],is_subfiles[]
long il_subdirs_number,il_subfiles_number,il_directory_space=0
constant ulong FO_MOVE = 1
constant ulong FO_COPY = 2
constant ulong FO_DELETE = 3
constant ulong FOF_ALLOWUNDO = 64
constant ulong FOF_FILESONLY = 128
end variables
forward prototypes
public function string of_get_directory_current ()
public function long of_set_directory_current ()
public function long of_set_directory_current (string as_dir_name)
public function string of_get_directory_app ()
public function string of_get_directory_temp ()
public function string of_get_directory_system ()
public function string of_get_directory_windows ()
public function string of_get_drive_type (string as_rootpathname)
public function string of_get_drive_cdrom ()
public function string of_directory_create_all (string as_directory)
public function boolean of_directory_delete (string as_directory)
public function long of_directory_no_recursion (string as_first_directory, string as_second_directory, ref stc_find_data as_file[])
public function long of_directory_no_recursion (string as_directory, ref stc_find_data as_file[])
public function long of_directory_dir (string as_directory, boolean no_first_dir, ref stc_find_data as_file[])
private function boolean of_set_file_attrib (string as_filename, boolean ab_readonly, boolean ab_hidden, boolean ab_system)
private function boolean of_set_file_attrib (string as_filename, unsignedlong aul_attrib)
private function boolean of_file_delete (string as_filename)
public function boolean of_drive_isavailable (string as_drive)
public function string of_get_drive_serialnumber (string as_drive)
public function string of_get_drive_volumename (string as_drive)
private function unsignedlong of_bitwiseor (unsignedlong aul_value1, unsignedlong aul_value2)
private function string of_shbrowseforfolder (long alhparent, string asprompt, long alflags)
public function string of_directory_browseforfolder (long alhparent, string asprompt)
public function string of_directory_browseforcomputer (long alhparent, string asprompt)
public function string of_directory_browseforprinter (long alhparent, string asprompt)
public function unsignedlong of_directory_netcancelconnection (ref string as_driver)
public function boolean of_drive_format (character as_drive)
private subroutine of_get_directory_subdirs (window aw_acton, string as_directory)
public function long of_get_directory_subdirs (window aw_acton, string as_directory, ref string as_subdirs[])
private subroutine of_get_directory_subfiles (window aw_acton, string as_directory)
public function long of_get_directory_subfiles (window aw_acton, string as_directory, ref string as_subfiles[])
public function long of_get_directory_capacity (window aw_window, string as_directory)
protected function long of_get_directory_usedcapacity (string as_directory)
private function unsignedlong of_bitwiseand (unsignedlong aul_value1, unsignedlong aul_value2)
private function integer of_get_last_pos (string as_string1, string as_string2, integer ai_bz)
public function long of_directory_uncompress (ref string as_documentname, ref string as_directory)
public function long of_directory_compress (ref string as_directory, ref string as_newdocument)
public function boolean of_directory_decrypt (ref string as_directory)
public function boolean of_directory_encrypt (ref string as_directory)
public function boolean of_directory_rename (ref string as_directory, ref string as_newname)
public function boolean of_directory_create (string as_directory)
public function boolean of_directory_isavailable (string as_directory)
public function unsignedlong of_directory_netaddconnection (ref string as_directory, ref string as_pass, ref string as_driver)
public function double of_get_drive_totalspace (string as_drive)
public function double of_get_drive_freespace (string as_drive)
public function double of_get_drive_usedspace (string as_drive)
public function string of_get_drive_filesystemname (string as_drive)
public function string of_get_directory_attributes (string as_directory)
public function datetime of_get_directory_createtime (string as_directory)
public function datetime of_get_directory_writetime (string as_directory)
public function datetime of_get_directory_accesstime (string as_directory)
private function long of_makechar (readonly string asstrings[], ref character acchar[])
public function string of_get_drive_list ()
private function boolean of_shfileoperation (ref shfileopstruct lpfileop)
public function boolean of_directory_copy_all (readonly string asfrom[], readonly string asto)
public function boolean of_directory_move_all (readonly string asfrom[], readonly string asto)
public function boolean of_directory_delete_all (readonly string asfrom[])
public function boolean of_directory_move (ref string as_directory1, ref string as_directory2)
end prototypes
public function string of_get_directory_current ();/*函数作用:获取当前的文件夹名称
返回值:string */
string ls_curdir
ulong l_buf
l_buf=256
ls_curdir=space(l_buf)
GetCurrentDirectoryA(l_buf,ls_curdir)
return ls_curdir
end function
public function long of_set_directory_current ();string ls_dir_name
ls_dir_name=this.of_get_directory_app()
return this.of_set_directory_current(mid(ls_dir_name,1,lastpos(ls_dir_name,"/") - 1))
end function
public function long of_set_directory_current (string as_dir_name);return SetCurrentDirectory(as_dir_name)
end function
public function string of_get_directory_app ();/*函数作用:获取当前运行的应用程序文件名称
返回值:string */
long ll_RC
String ls_AppPath
long ll_apphandler
ll_apphandler = handle(GetApplication())
ls_AppPath = Space(256)
ll_RC = GetModuleFileNameA(ll_apphandler, ls_AppPath, 256)
IF (ll_RC = 0) THEN ls_AppPath = ""
return ls_apppath
end function
public function string of_get_directory_temp ();/*函数作用:获取系统临时文件夹名
返回值:string */
ulong nBufferLength=255
string lpBuffer
lpbuffer=fill(' ',255)
GetTempPath(nBufferLength,lpBuffer)
return lpbuffer
end function
public function string of_get_directory_system ();/*函数作用:获取系统文件夹名
返回值:string */
string ls_Buffer
ulong ll_RequiredBufferSize
ls_Buffer=Space(255)
ll_RequiredBufferSize=GetSystemDirectoryA(ls_Buffer,255)
IF ll_RequiredBufferSize=0 or ll_RequiredBufferSize>255 THEN SetNull(ls_Buffer)
RETURN ls_Buffer
end function
public function string of_get_directory_windows ();/*函数作用:获取windows文件夹名
返回值:string */
string ls_Buffer
ulong ll_RequiredBufferSize
ls_Buffer=Space(255)
ll_RequiredBufferSize=GetWindowsDirectoryA(ls_Buffer,255)
IF ll_RequiredBufferSize=0 or ll_RequiredBufferSize>255 THEN SetNull(ls_Buffer)
RETURN ls_Buffer
end function
public function string of_get_drive_type (string as_rootpathname);/*函数作用:获取指定的驱动器的类型
参数:as_drive string 驱动器名
返回值:string */
string ls_DriveType
as_RootPathName=Left(as_RootPathName,1)+":"
CHOOSE CASE GetDriveTypeA(as_RootPathName)
CASE 2
ls_DriveType="REMOVABLE"
CASE 3
ls_DriveType="FIXED"
CASE 4
ls_DriveType="REMOTE"
CASE 5
ls_DriveType="CDROM"
CASE 6
ls_DriveType="RAMDISK"
CASE ELSE
SetNull(ls_DriveType)
END CHOOSE
RETURN ls_DriveType
end function
public function string of_get_drive_cdrom ();/*函数作用:获取光驱的驱动器名
返回值:string */
integer li_i,li_start,li_end
string ls_CDRoms=""
li_start=Asc("A")
li_end=Asc("Z")
FOR li_i=li_start TO li_end
IF of_get_drive_Type(Char(li_i))="CDROM" THEN ls_CDRoms=ls_CDRoms+Char(li_i)
NEXT
RETURN ls_CDRoms
end function
public function string of_directory_create_all (string as_directory);/*函数作用:建立一个新目录(包含父文件夹)
参数: as_directory string 文件夹名称
返回值:boolean */
String ls_ret,ls_path[]
Int li_i,li_j,li_pos=1
ls_ret = "OK"
Do While li_pos>0
IF DirectoryExists(as_directory) THEN Exit
li_i++ ; ls_path[li_i] = as_directory
li_pos = of_get_last_pos(as_directory,"/",1)
as_directory = Left(as_directory,li_pos)
Loop
For li_j = li_i To 1 Step -1 //建立目录
IF 1 <> CreateDirectory(ls_path[li_j]) THEN
ls_ret="FA" ; Exit
END IF
Next
Return Ls_ret
end function
public function boolean of_directory_delete (string as_directory);/*函数作用:删除一个目录,不能有子文件和文件夹
参数: as_directory string 文件夹名称
返回值:boolean */
return RemoveDirectoryA(as_directory)
end function
public function long of_directory_no_recursion (string as_first_directory, string as_second_directory, ref stc_find_data as_file[]);long i,j,k
stc_find_data lss_temp
string ls_swap
k=upperbound(as_file) + 1
if mid(as_first_directory,len(as_first_directory))<>"/" then
as_first_directory=as_first_directory+"/"
end if
if mid(as_second_directory,len(as_second_directory))<>"/" and len(as_second_directory)>0 then
as_second_directory=as_second_directory+"/"
end if
ls_swap=as_first_directory+as_second_directory+"*"
i=findfirstfile(ls_swap,lss_temp)
if i= - 1 then
return -1
end if
j=i
do while j<>0
if lss_temp.cfilename='.' or lss_temp.cfilename='..' or len(trim(lss_temp.cfilename))=0 then
else
as_file[k]=lss_temp
as_file[k].cfilename=as_second_directory+as_file[k].cfilename
k++
end if
j=findnextfile(i,lss_temp)
loop
findclose(i)
return k - 1
end function
public function long of_directory_no_recursion (string as_directory, ref stc_find_data as_file[]);long i,j,k
stc_find_data lss_temp
string ls_swap
k=upperbound(as_file) + 1
if mid(as_directory,len(as_directory))<>"/" then
as_directory=as_directory+"/"
end if
ls_swap=as_directory+"*"
i=findfirstfile(ls_swap,lss_temp)
if i= - 1 then
return -1
end if
j=i
do while j<>0
if lss_temp.cfilename='.' or lss_temp.cfilename=".." or len(trim(lss_temp.cfilename))=0 then
else
as_file[k]=lss_temp
as_file[k].cfilename=as_directory+as_file[k].cfilename
k++
end if
j=findnextfile(i,lss_temp)
loop
findclose(i)
return k - 1
end function
public function long of_directory_dir (string as_directory, boolean no_first_dir, ref stc_find_data as_file[]);long i,j
if no_first_dir then
if this.of_directory_no_recursion(as_directory,'',as_file)>0 then
j=upperbound(as_file)
for i=1 to j
if (mod(as_file[i].att,32) - mod(as_file[i].att,16)) >0 then
this.of_directory_no_recursion(as_directory,as_file[i].cfilename,as_file)
j=upperbound(as_file)
end if
next
end if
else
if this.of_directory_no_recursion(as_directory,as_file)>0 then
j=upperbound(as_file)
for i=1 to j
if (mod(as_file[i].att,32) - mod(as_file[i].att,16)) >0 then
this.of_directory_no_recursion(as_file[i].cfilename,as_file)
j=upperbound(as_file)
end if
next
end if
end if
//f_shu_debug(string(j))
return j
end function
private function boolean of_set_file_attrib (string as_filename, boolean ab_readonly, boolean ab_hidden, boolean ab_system);ulong lul_attrib=0
if ab_readonly then
lul_attrib = lul_attrib + 1
end if
if ab_hidden then
lul_attrib = lul_attrib + 2
end if
if ab_system then
lul_attrib = lul_attrib + 4
end if
return not setfileattributes(as_filename,lul_attrib)=0
end function
private function boolean of_set_file_attrib (string as_filename, unsignedlong aul_attrib);return not setfileattributes(as_filename,aul_attrib)=0
end function
private function boolean of_file_delete (string as_filename);/*函数作用:删除指定的文件
参数: string as_filename 需删除的文件名称
返回值:boolean */
return deletefilea(as_filename)
end function
public function boolean of_drive_isavailable (string as_drive);/*函数作用:判断驱动器名是否合法
参数: string as_drive 驱动器名称
返回值:boolean */
RETURN not IsNull(of_Get_drive_Type(as_drive))
end function
public function string of_get_drive_serialnumber (string as_drive);/*函数作用:获取指定的驱动器的序列号
参数:as_drive string 驱动器名
返回值:string */
string ls_VolumeNameBuffer
ulong ll_VolumeSerialNumber
ulong ll_MaximumComponentLength
ulong ll_FileSystemFlags
string ls_FileSystemNameBuffer
as_drive=Left(as_drive,1)+":"
ls_VolumeNameBuffer=Space(20)
ls_FileSystemNameBuffer=Space(20)
IF not GetVolumeInformationA(as_drive,ls_VolumeNameBuffer,20,ll_VolumeSerialNumber,ll_MaximumComponentLength,ll_FileSystemFlags,ls_FileSystemNameBuffer,20) THEN
SetNull(ll_VolumeSerialNumber)
END IF
RETURN String(ll_VolumeSerialNumber)
end function
public function string of_get_drive_volumename (string as_drive);/*函数作用:获取指定的驱动器的卷标名称
参数:as_drive string 驱动器名
返回值:string */
string ls_VolumeNameBuffer
ulong ll_VolumeSerialNumber
ulong ll_MaximumComponentLength
ulong ll_FileSystemFlags
string ls_FileSystemNameBuffer
as_drive=Left(as_drive,1)+":"
ls_VolumeNameBuffer=Space(20)
ls_FileSystemNameBuffer=Space(20)
IF not GetVolumeInformationA(as_drive,ls_VolumeNameBuffer,20,ll_VolumeSerialNumber,ll_MaximumComponentLength,ll_FileSystemFlags,ls_FileSystemNameBuffer,20) THEN
SetNull(ls_VolumeNameBuffer)
END IF
RETURN ls_VolumeNameBuffer
end function
private function unsignedlong of_bitwiseor (unsignedlong aul_value1, unsignedlong aul_value2);/*函数作用:对两个long类型数据进行位或操作
参数: aul_value1 unsignedlong
aul_value2 unsignedlong
返回值:unsignedlong */
UnsignedLong lul_Result = 0
Unsignedlong lul_multiple = 1
Unsignedlong lul_bit
If IsNull(aul_Value1) Or IsNull(aul_Value2) Then
SetNull(lul_Result)
Return lul_Result
End If
Do
lul_bit = (mod (aul_value1, 2) + mod (aul_value2, 2) + 1) /2
lul_Result += lul_bit * lul_multiple
aul_value1 = aul_value1 /2
aul_value2 = aul_value2 /2
lul_multiple *= 2
Loop Until aul_value1 = 0 And aul_value2 = 0
Return lul_Result
end function
private function string of_shbrowseforfolder (long alhparent, string asprompt, long alflags);constant long max_path=260
long llIDList
stc_BROWSEINFO lBI
string lsPath
lBI.hWndOwner = alhParent
lBI.pidlRoot = 0
lBI.pszDisplayName = Space( MAX_PATH )
lBI.lpszTitle = asPrompt
lBI.ulFlags = alFlags
lBI.lpfn = 0
lBI.lParam = 0
lBI.iImage = 0
llIDList = SHBrowseForFolder( lBI )
IF (llIDList > 0) THEN
lsPath = Space( MAX_PATH )
IF NOT SHGetPathFromIDList( llIDList, lsPath ) THEN
lsPath = ""
END IF
ELSE
lsPath = ""
END IF
RETURN Trim(lsPath)
end function
public function string of_directory_browseforfolder (long alhparent, string asprompt);/*函数作用:对获取文件夹对话框
参数: alparent long 父对象的对象句柄
as_prompt string 对话框上标签内容
返回值:string */
constant long BIF_RETURNONLYFSDIRS=1
RETURN This.of_SHBrowseForFolder( alhParent, asPrompt, BIF_RETURNONLYFSDIRS )
end function
public function string of_directory_browseforcomputer (long alhparent, string asprompt);/*函数作用:对获取文件夹对话框(含网上邻居)
参数: alparent long 父对象的对象句柄
as_prompt string 对话框上标签内容
返回值:string */
constant ulong BIF_BROWSEFORCOMPUTER = 4096
RETURN This.of_SHBrowseForFolder( alhParent, asPrompt, BIF_BROWSEFORCOMPUTER )
end function
public function string of_directory_browseforprinter (long alhparent, string asprompt);/*函数作用:对获取文件夹对话框(含打印机)
参数: alparent long 父对象的对象句柄
as_prompt string 对话框上标签内容
返回值:string */
constant ulong BIF_BROWSEFORPRINTER = 8192
RETURN This.of_SHBrowseForFolder( alhParent, asPrompt, BIF_BROWSEFORPRINTER )
end function
public function unsignedlong of_directory_netcancelconnection (ref string as_driver);/*函数作用:断开映射的本地驱动器
参数: as_driver string 本地映射驱动器名称
返回值:unsignedlong */
return WNetCancelConnection(as_driver,false)
end function
public function boolean of_drive_format (character as_drive);/*函数作用:对指定驱动器进行格式化
参数: string as_drive 需格式化的驱动器名称
返回值:boolean */
RETURN (SHFormatDrive( 0, Asc(Upper(as_drive)) - 65, 0, 0 ) <> 0)
end function
private subroutine of_get_directory_subdirs (window aw_acton, string as_directory);long ll,li,il_subdirs
DragObject il_lsb
string is_listitem
if right(as_directory,1)<>"/" then as_directory=as_directory+"/"
aw_acton.openuserobject(il_lsb,"listbox",0,0)
il_lsb.dynamic dirlist(as_directory+"*.2345",16)
il_subdirs=il_lsb.dynamic totalitems()
for ll=1 to il_subdirs
is_listitem=il_lsb.dynamic text(ll)
if is_listitem="[..]" then CONTINUE
li = upperbound(is_subdirs)
is_subdirs[li +1]=as_directory+mid(is_listitem,2,len(is_listitem) - 2)
of_get_directory_subdirs(aw_acton,is_subdirs[li+1])
next
aw_acton.closeuserobject(il_lsb)
destroy il_lsb
end subroutine
public function long of_get_directory_subdirs (window aw_acton, string as_directory, ref string as_subdirs[]);/*函数作用:获取指定的文件夹的子文件夹列表
参数:aw_window window 父窗口名称
as_directory string 文件夹名称,需绝对路径
as_subdirs[] string 存储子文件夹列表的string数组
返回值:long */
long ll_return
of_get_directory_subdirs(aw_acton,as_directory)
as_subdirs=is_subdirs
return il_subdirs_number
end function
private subroutine of_get_directory_subfiles (window aw_acton, string as_directory);long ll,li,il_subfiles
DragObject il_lsb
string is_listitem
if right(as_directory,1)<>"/" then as_directory=as_directory+"/"
aw_acton.openuserobject(il_lsb,"listbox",0,0)
il_lsb.dynamic dirlist(as_directory+"*.*",32823)
il_subfiles=il_lsb.dynamic totalitems()
for ll=1 to il_subfiles
is_listitem=il_lsb.dynamic text(ll)
if mid(is_listitem,1,1)<>"[" then
li = upperbound(is_subfiles)
is_subfiles[li +1]=as_directory+is_listitem
elseif is_listitem<>"[..]" then
of_get_directory_subfiles(aw_acton,as_directory+mid(is_listitem,2,len(is_listitem) - 2))
end if
next
il_subfiles_number=upperbound(is_subfiles)
aw_acton.closeuserobject(il_lsb)
destroy il_lsb
end subroutine
public function long of_get_directory_subfiles (window aw_acton, string as_directory, ref string as_subfiles[]);/*函数作用:获取指定的文件夹的子文件列表
参数:aw_window window 父窗口名称
as_directory string 文件夹名称,需绝对路径
as_subfiles[] string 存储子文件列表的string数组
返回值:long */
long ll_return
of_get_directory_subfiles(aw_acton,as_directory)
as_subfiles=is_subfiles
return il_subfiles_number
end function
public function long of_get_directory_capacity (window aw_window, string as_directory);/*函数作用:获取指定的文件夹的实际大小
参数:aw_window window 父窗口名称
as_directory string 文件夹名称,需绝对路径
返回值:long */
long ll_directory_length=0,ll
string ls_subfiles[]
of_get_directory_subfiles(aw_window,as_directory,ls_subfiles)
for ll=1 to upperbound(ls_subfiles)
ll_directory_length=ll_directory_length+filelength(ls_subfiles[ll])
next
return ll_directory_length
end function
protected function long of_get_directory_usedcapacity (string as_directory);/*函数作用:获取指定的文件夹的占用空间大小
as_directory string 文件夹名称,需绝对路径
返回值:long */
Constant long MAX_PATH = 260
Constant long INVALID_HANDLE_value = -1
Constant long FILE_ATTRIBUTE_DIRECTORY =16
stc_find_data f
long hfile,hsize
If Right(as_directory, 1) <> "/" Then as_directory = as_directory+"/"
as_directory=as_directory
hFile = FindFirstFile(as_directory, f)
If hFile = INVALID_HANDLE_value Then return 0
If of_bitwiseand(f.Att,FILE_ATTRIBUTE_DIRECTORY) = 0 Then
il_directory_space = il_directory_space + f.l_size
end if
FindClose (hFile)
return il_directory_space
end function
private function unsignedlong of_bitwiseand (unsignedlong aul_value1, unsignedlong aul_value2);/*函数作用:对两个long类型数据进行位与操作
参数: aul_value1 unsignedlong
aul_value2 unsignedlong
返回值:unsignedlong */
UnsignedLong lul_Result = 0
Unsignedlong lul_multiple = 1
Unsignedlong lul_bit
If IsNull(aul_Value1) Or IsNull(aul_Value2) Then
SetNull(lul_Result)
Return lul_Result
End If
Do
lul_bit = mod (aul_value1, 2) * mod (aul_value2, 2)
lul_Result += lul_bit * lul_multiple
aul_value1 = aul_value1 /2
aul_value2 = aul_value2 /2
lul_multiple *= 2
Loop Until aul_value1 = 0 Or aul_value2 = 0
Return lul_Result
end function
private function integer of_get_last_pos (string as_string1, string as_string2, integer ai_bz);Integer li_len,li_i
String ls_reverse
li_len = Len(as_string1)
IF ai_bz=0 THEN
as_string1=Upper(as_string1) ; as_string2=Upper(as_string2)
END IF
ls_reverse = reverse(as_string1)
li_i = li_len - Pos(as_string1,as_string2,1)
Return li_i
end function
public function long of_directory_uncompress (ref string as_documentname, ref string as_directory);/*函数作用:对压缩文件夹进行解压缩
参数: string as_documentname 需解压缩的文件名,绝对路径
string as_directory 目标文件夹,绝对路径
返回值:long */
return MyZip_ExtractFileAll(as_documentname,as_directory)
end function
public function long of_directory_compress (ref string as_directory, ref string as_newdocument);/*函数作用:对文件夹进行压缩
参数: string as_directory 文件夹绝对路径
string as_newdocument 压缩后的文件名,绝对路径
返回值:long */
if right(as_directory,1)="/" then
as_directory=mid(as_directory,1,len(as_directory) - 1)
end if
return MyZip_AddDirectory(as_directory,as_newdocument)
end function
public function boolean of_directory_decrypt (ref string as_directory);/*函数作用:文件夹解密,只能用与win2000以上os
参数: as_directory string 文件夹名称
返回值:boolean */
if right(as_directory,1)="/" then
as_directory=mid(as_directory,1,len(as_directory) - 1)
end if
return decryptFile(as_directory,0)
end function
public function boolean of_directory_encrypt (ref string as_directory);/*函数作用:文件夹加密,只能用与win2000以上os
参数: as_directory string 文件夹名称
返回值:boolean */
if right(as_directory,1)="/" then
as_directory=mid(as_directory,1,len(as_directory) - 1)
end if
return EncryptFile(as_directory)
end function
public function boolean of_directory_rename (ref string as_directory, ref string as_newname);/*函数作用:重命名文件夹
参数: as_directory string 原文件夹名称,需绝对路径
as_newname string 文件夹新名称,不需带路径
返回值:boolean */
string ls_directoryname
if right(as_directory,1)="/" then
as_directory=mid(as_directory,len(as_directory) - 1)
end if
ls_directoryname=mid(as_directory,1,lastpos(as_directory,"/"))+as_newname
return MoveFileA(as_directory,ls_directoryname)
end function
public function boolean of_directory_create (string as_directory);/*函数作用:建立一个新目录
参数: as_directory1 string 文件夹名称
返回值:boolean */
string ls_SecurityAttributes
SetNull(ls_SecurityAttributes)
RETURN CreateDirectoryA(as_directory,ls_SecurityAttributes)
end function
public function boolean of_directory_isavailable (string as_directory);/*函数作用:判断文件夹是否存在
参数: as_directory string 文件夹名称
返回值:boolean */
String ls_Attributes
nvo_file invo_file
ls_Attributes=invo_file.of_Get_file_Attributes(as_directory)
IF IsNull(ls_Attributes) THEN RETURN FALSE
RETURN Pos(ls_Attributes,"D")>0
end function
public function unsignedlong of_directory_netaddconnection (ref string as_directory, ref string as_pass, ref string as_driver);/*函数作用:映射网络文件夹为本地驱动器
参数: as_directory string 文件夹名称
as_pass string 访问口令
as_driver 本地驱动器名称
返回值:unsignedlong */
return WnetAddConnection(as_directory, as_pass, as_driver)
end function
public function double of_get_drive_totalspace (string as_drive);/*函数作用:获取指定的驱动器的空间大小
参数:as_drive string 驱动器名
返回值:real */
Double ld_capacity
any ia_pass
if right(as_drive,1)<>":" then
as_drive=as_drive+":"
end if
LARGE_INTEGER lngFreeCaller,lngTotal,lngTotalFree
GetDiskFreeSpaceExA(as_drive, lngFreeCaller, lngTotal, lngTotalFree)
IF lngTotal.Highpart > 0 THEN
ld_capacity = ( lngTotal.Highpart * 1.0 * 4294967295 ) +lngTotal.LowPart
ELSE
ld_capacity = lngTotal.LowPart
END IF
return ld_capacity
end function
public function double of_get_drive_freespace (string as_drive);/*函数作用:获取指定的驱动器的可用空间大小
参数:as_drive string 驱动器名
返回值:real */
Double ld_capacity
any ia_pass
if right(as_drive,1)<>":" then
as_drive=as_drive+":"
end if
LARGE_INTEGER lngFreeCaller,lngTotal,lngTotalFree
GetDiskFreeSpaceExA(as_drive, lngFreeCaller, lngTotal, lngTotalFree)
IF lngTotalFree.Highpart > 0 THEN
ld_capacity = ( lngTotalFree.Highpart * 1.0 * 4294967295 ) +lngTotalFree.LowPart
ELSE
ld_capacity = lngTotalFree.LowPart
END IF
return ld_capacity
end function
public function double of_get_drive_usedspace (string as_drive);/*函数作用:获取指定的驱动器的已用空间大小
参数:as_drive string 驱动器名
返回值:double */
Double ld_capacity1,ld_capacity2
any ia_pass
if right(as_drive,1)<>":" then
as_drive=as_drive+":"
end if
LARGE_INTEGER lngFreeCaller,lngTotal,lngTotalFree
GetDiskFreeSpaceExA(as_drive, lngFreeCaller, lngTotal, lngTotalFree)
IF lngTotal.Highpart > 0 THEN
ld_capacity1 = ( lngTotal.Highpart * 1.0 * 4294967295 ) +lngTotal.LowPart
ELSE
ld_capacity1 = lngTotal.LowPart
END IF
IF lngTotalFree.Highpart > 0 THEN
ld_capacity2 = ( lngTotalFree.Highpart * 1.0 * 4294967295 ) +lngTotalFree.LowPart
ELSE
ld_capacity2 = lngTotalFree.LowPart
END IF
return ld_capacity1 - ld_capacity2
end function
public function string of_get_drive_filesystemname (string as_drive);/*函数作用:获取指定的驱动器的文件系统名称
参数:as_drive string 驱动器名
返回值:string */
string ls_VolumeNameBuffer
ulong ll_VolumeSerialNumber
ulong ll_MaximumComponentLength
ulong ll_FileSystemFlags
string ls_FileSystemNameBuffer
if right(as_drive,1)<>"/" then
as_drive=as_drive+"/"
end if
ls_VolumeNameBuffer=Space(20)
ls_FileSystemNameBuffer=Space(20)
GetVolumeInformationA(as_drive,ls_VolumeNameBuffer,20,ll_VolumeSerialNumber,ll_MaximumComponentLength,ll_FileSystemFlags,ls_FileSystemNameBuffer,20)
RETURN ls_FileSystemNameBuffer
end function
public function string of_get_directory_attributes (string as_directory);long ll_fileattributes
string ls_fileattributes
ll_fileattributes=GetFileAttributes(as_directory)
IF ll_FileAttributes=4294967295 THEN
SetNull(ls_FileAttributes)
ELSE
IF Mod(ll_FileAttributes, 2) > 0 THEN ls_FileAttributes += "R"
IF Mod(ll_FileAttributes, 4) > 1 THEN ls_FileAttributes += "H"
IF Mod(ll_FileAttributes, 8) > 3 THEN ls_FileAttributes += "S"
IF Mod(ll_FileAttributes,32) > 15 THEN ls_FileAttributes += "D"
IF Mod(ll_FileAttributes,64) > 31 THEN ls_FileAttributes += "A"
END IF
RETURN ls_FileAttributes
end function
public function datetime of_get_directory_createtime (string as_directory);/*函数作用:获取文件夹的创建时间
参数: as_filename string 文件名,需绝对文件路径
返回值:datetime */
long ll_code
datetime ldt_filedatetime
long lul_date,lul_time
int lui_year,lui_month,lui_day,lui_hour,lui_minute,lui_second
stc_find_data ls_file
ll_code=findfirstfile(as_directory,ls_file)
findclose(ll_code)
ldt_filedatetime=datetime(ls_file.c_time)
if ll_code=-1 then
setnull(ldt_filedatetime)
else
filetimetodosdatetime (ls_file.c_time,lul_date,lul_time)
lui_day=mod(lul_date,32)
lui_month=mod(lul_date,512)/32
if lui_month=0 then
lui_month=1
end if
lui_year=lul_date/512+1980
lui_second=mod(lul_time,32)*2
lui_minute=mod(lul_time,2048)/32
lui_hour=(lul_time)/2048 + 8
if lui_hour>=24 then
lui_hour=lui_hour - 24
ldt_filedatetime=datetime(relativedate(date(lui_year,lui_month,lui_day),1),time(lui_hour,lui_minute,lui_second))
else
ldt_filedatetime=datetime(date(lui_year,lui_month,lui_day),time(lui_hour,lui_minute,lui_second))
end if
end if
return ldt_filedatetime
end function
public function datetime of_get_directory_writetime (string as_directory);/*函数作用:获取文件夹的最后读写时间
参数: as_filename string 文件名,需绝对文件路径
返回值:datetime */
long ll_code
datetime ldt_filedatetime
long lul_date,lul_time
int lui_year,lui_month,lui_day,lui_hour,lui_minute,lui_second
stc_find_data ls_file
ll_code=findfirstfile(as_directory,ls_file)
findclose(ll_code)
ldt_filedatetime=datetime(ls_file.a_time)
if ll_code=-1 then
setnull(ldt_filedatetime)
else
filetimetodosdatetime (ls_file.a_time,lul_date,lul_time)
lui_day=mod(lul_date,32)
lui_month=mod(lul_date,512)/32
if lui_month=0 then
lui_month=1
end if
lui_year=lul_date/512+1980
lui_second=mod(lul_time,32)*2
lui_minute=mod(lul_time,2048)/32
lui_hour=(lul_time)/2048 + 8
if lui_hour>=24 then
lui_hour=lui_hour - 24
ldt_filedatetime=datetime(relativedate(date(lui_year,lui_month,lui_day),1),time(lui_hour,lui_minute,lui_second))
else
ldt_filedatetime=datetime(date(lui_year,lui_month,lui_day),time(lui_hour,lui_minute,lui_second))
end if
end if
return ldt_filedatetime
end function
public function datetime of_get_directory_accesstime (string as_directory);/*函数作用:获取文件夹的最后访问时间
参数: as_filename string 文件名,需绝对文件路径
返回值:datetime */
long ll_code
datetime ldt_filedatetime
long lul_date,lul_time
int lui_year,lui_month,lui_day,lui_hour,lui_minute,lui_second
stc_find_data ls_file
ll_code=findfirstfile(as_directory,ls_file)
findclose(ll_code)
ldt_filedatetime=datetime(ls_file.a_time)
if ll_code=-1 then
setnull(ldt_filedatetime)
else
filetimetodosdatetime (ls_file.a_time,lul_date,lul_time)
lui_day=mod(lul_date,32)
lui_month=mod(lul_date,512)/32
if lui_month=0 then
lui_month=1
end if
lui_year=lul_date/512+1980
lui_second=mod(lul_time,32)*2
lui_minute=mod(lul_time,2048)/32
lui_hour=(lul_time)/2048 + 8
if lui_hour>=24 then
lui_hour=lui_hour - 24
ldt_filedatetime=datetime(relativedate(date(lui_year,lui_month,lui_day),1),time(lui_hour,lui_minute,lui_second))
else
ldt_filedatetime=datetime(date(lui_year,lui_month,lui_day),time(lui_hour,lui_minute,lui_second))
end if
end if
return ldt_filedatetime
end function
private function long of_makechar (readonly string asstrings[], ref character acchar[]);
char lcChar[], lcString[]
long llStringCount, llStringIndex
long llCharCount, llCharIndex
// Count number of strings in array
llStringCount = UpperBound( asStrings[] )
IF (llStringCount > 0) THEN
// Add each of the strings to the char array
FOR llStringIndex = 1 TO llStringCount
// Get length of current string
llCharCount = Len( asStrings[llStringIndex] )
IF llCharCount > 0 THEN
// Convert string into char array
lcString = asStrings[llStringIndex]
// Concatenate string to existing char array
FOR llCharIndex = 1 TO llCharCount
lcChar[UpperBound(lcChar) + 1] = lcString[llCharIndex]
NEXT
// Terminate each string with a null character
lcChar[UpperBound(lcChar) + 1] = Char(0)
END IF
NEXT
// The last element must be double-null terminated
lcChar[UpperBound(lcChar) + 1] = Char(0)
END IF
// Set reference argument
acChar = lcChar
// Return length of char array
RETURN UpperBound( lcChar )
end function
public function string of_get_drive_list ();/*函数作用:获取驱动器列表
参数: none
返回值:string */
long c,i,pos,l=255
string ls_drive
blob{255} b
c = GetLogicalDriveStrings(l,ref b)
if c>0 then
for i=1 to c
if asc(char(blobmid(b,i,1))) <>0 then
ls_drive = ls_drive+ char(blobmid(b,i,1))
else
ls_drive = ls_drive+";"
end if
next
end if
return ls_drive
end function
private function boolean of_shfileoperation (ref shfileopstruct lpfileop);
RETURN ( SHFileOperation(lpFileOp) = 0)
end function
public function boolean of_directory_copy_all (readonly string asfrom[], readonly string asto);SHFILEOPSTRUCT lpFileOp
Char lcFrom[]
long lpString
boolean lbCopy = FALSE
// Convert array of strings into a single null-seperated char array
IF This.of_MakeChar( asFrom[], lcFrom ) > 0 THEN
// Allocate memory for char array (pString)
lpString = LocalAlloc( 0, UpperBound(lcFrom) )
// Copy char array into newly allocated memory
RtlMoveMemory( lpString, lcFrom, UpperBound(lcFrom) )
// Populate FileOperation structure
lpFileOp.hWnd = 0 // No parent dialog
lpFileOp.wFunc = FO_COPY // Perform a COPY operation
lpFileOp.pFrom = lpString // Source files
lpFileOp.pTo = asTo // Destination directory
lpFileOp.fFlags = FOF_ALLOWUNDO + FOF_FILESONLY // Save UNDO info
lpFileOp.fAnyOperationsAborted = FALSE // This is an OUTPUT var to indicate user aborted
lpFileOp.hNameMappings = 0 // Do not want old/new pathnames
lpFileOp.lpszProgressTitle = "" // Display default message (ie. file currently being copied).
// Perform copy
lbCopy = This.of_SHFileOperation( lpFileOp )
// Free allocated memory
LocalFree( lpString )
END IF
// Return results of copy
RETURN lbCopy
end function
public function boolean of_directory_move_all (readonly string asfrom[], readonly string asto);SHFILEOPSTRUCT lpFileOp
Char lcFrom[]
long lpString
boolean lbMove = FALSE
// Convert array of strings into a single null-seperated char array
IF This.of_MakeChar( asFrom[], lcFrom ) > 0 THEN
// Allocate memory for char array (pString)
lpString = LocalAlloc( 0, UpperBound(lcFrom) )
// Copy char array into newly allocated memory
RtlMoveMemory( lpString, lcFrom, UpperBound(lcFrom) )
// Populate FileOperation structure
lpFileOp.hWnd = 0 // No parent dialog
lpFileOp.wFunc = FO_MOVE // Perform a MOVE operation
lpFileOp.pFrom = lpString // Source files
lpFileOp.pTo = asTo // Destination directory
lpFileOp.fFlags = FOF_ALLOWUNDO + FOF_FILESONLY // Save UNDO info
lpFileOp.fAnyOperationsAborted = FALSE // This is an OUTPUT var to indicate user aborted
lpFileOp.hNameMappings = 0 // Do not want old/new pathnames
lpFileOp.lpszProgressTitle = "" // Display default message (ie. file currently being copied).
// Perform move
lbMove = This.of_SHFileOperation( lpFileOp )
// Free allocated memory
LocalFree( lpString )
END IF
// Return results of move
RETURN lbMove
end function
public function boolean of_directory_delete_all (readonly string asfrom[]);
SHFILEOPSTRUCT lpFileOp
Char lcFrom[]
long lpString
boolean lbDelete = FALSE
// Convert array of strings into a single null-seperated char array
IF This.of_MakeChar( asFrom[], lcFrom ) > 0 THEN
// Allocate memory for char array (pString)
lpString = LocalAlloc( 0, UpperBound(lcFrom) )
// Copy char array into newly allocated memory
RtlMoveMemory( lpString, lcFrom, UpperBound(lcFrom) )
// Populate FileOperation structure
lpFileOp.hWnd = 0 // No parent dialog
lpFileOp.wFunc = FO_DELETE // Perform a DELETE operation
lpFileOp.pFrom = lpString // Source files
lpFileOp.pTo = "" // Not used for DELETE
lpFileOp.fFlags = FOF_ALLOWUNDO + FOF_FILESONLY // Save UNDO info
lpFileOp.fAnyOperationsAborted = FALSE // This is an OUTPUT var to indicate user aborted
lpFileOp.hNameMappings = 0 // Do not want old/new pathnames
lpFileOp.lpszProgressTitle = "" // Display default message (ie. file currently being copied).
// Perform delete
lbDelete = This.of_SHFileOperation( lpFileOp )
// Free allocated memory
LocalFree( lpString )
END IF
// Return results of delete
RETURN lbDelete
end function
public function boolean of_directory_move (ref string as_directory1, ref string as_directory2);/*函数作用:移动文件夹
参数: as_directory1 string 被移动文件夹名称
as_directory2 string 目标文件夹
返回值:boolean */
if right(as_directory1,1)="/" then
as_directory1=mid(as_directory1,len(as_directory1) - 1)
end if
if right(as_directory2,1)="/" then
as_directory2=mid(as_directory2,len(as_directory2) - 1)
end if
return MoveFileA(as_directory1,as_directory2)
end function
on nvo_directory.create
call super::create
TriggerEvent( this, "constructor" )
end on
on nvo_directory.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on