分享
 
 
 

自己封装的一个文件目录操作用户对象

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

$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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有