找回密码
 加入
搜索
查看: 3901|回复: 3

[效率算法] [已解决]如何快速将本地文件连同文件size遍历写入数组?

[复制链接]
发表于 2012-8-2 21:27:04 | 显示全部楼层 |阅读模式
本帖最后由 palkiller 于 2012-8-6 11:50 编辑
#include <Array.au3>
#Include <File.au3>
#NoTrayIcon
$begin=TimerInit()
$local_files=_FileListToArray(@WindowsDir&"\system32","*",1)
Dim $f[1][2]
For $i=1 To $local_files[0]
        $lfile_size=size(FileGetSize(@WindowsDir&"\system32"&$local_files[$i]))
        __ArrayAdd($f,$local_files[$i],$lfile_size)
Next
$time=TimerDiff($begin)
_ArrayDisplay($f,"用时"&Round($time/1000,2)&"秒")

Func __ArrayAdd(ByRef $avArray, $vValue0, $vValue1 = '', $0_auto = 1)
        If Not IsArray($avArray) Then Return SetError(1, 0, -1)
        Local $iUBound = UBound($avArray)
        If UBound($avArray, 0) = 1 Then 
                If $0_auto And $avArray[0] = $iUBound-1 Then $avArray[0] += 1
                        ReDim $avArray[$iUBound + 1]
                        $avArray[$iUBound] = $vValue0
        ElseIf UBound($avArray, 0) = 2 Then 
                        If $0_auto And $avArray[0][0] = $iUBound-1 Then $avArray[0][0] += 1
                        ReDim $avArray[$iUBound + 1][2]
                        $avArray[$iUBound][0] = $vValue0
                        $avArray[$iUBound][1] = $vValue1
        ElseIf UBound($avArray, 0) > 2 Then
                Return SetError(2, 0, -1)
        EndIf
        Return $iUBound
EndFunc

Func size($size)
        If $size<1024 Then
                $size=$size&"B"
        ElseIf $size>=1024 And $size<1048576 Then
                $size=Round($size/1024,2)&"KB"
        ElseIf $size>=1048576 And $size<1073741824 Then
                $size=Round($size/1048576,2)&"MB"
        ElseIf $size>=1073741824 And $size<1099511627776 Then
                $size=Round($size/1073741824,2)&"GB"
        Else
                $size=Round($size/1099511627776,2)&"TB"
        EndIf
        Return $size
EndFunc
上面的代码遍历一个3000多文件的文件夹,耗时10秒多,太悲催了...不知道各位达人有没有更快捷的方法,求指点...
发表于 2012-8-2 21:49:23 | 显示全部楼层
ReDim 太耗时
发表于 2012-8-2 21:54:58 | 显示全部楼层
#include <Array.au3>
#include <File.au3>

$begin = TimerInit()
$local_files = _FileListToArray(@WindowsDir & '\system32\', '*', 1)
Dim $f[$local_files[0] + 1][2] = [[$local_files[0]]]

For $i = 1 To $local_files[0]
        $lfile_size = size(FileGetSize(@WindowsDir & '\system32\' & $local_files[$i]))
        $f[$i][0] = $local_files[$i]
        $f[$i][1] = $lfile_size
Next
$time = TimerDiff($begin)
_ArrayDisplay($f, '用时' & Round($time / 1000, 2) & '秒')

Func size($size)
        If $size < 1024 Then
                $size = $size & 'B'
        ElseIf $size >= 1024 And $size < 1048576 Then
                $size = Round($size / 1024, 2) & 'KB'
        ElseIf $size >= 1048576 And $size < 1073741824 Then
                $size = Round($size / 1048576, 2) & 'MB'
        ElseIf $size >= 1073741824 And $size < 1099511627776 Then
                $size = Round($size / 1073741824, 2) & 'GB'
        Else
                $size = Round($size / 1099511627776, 2) & 'TB'
        EndIf
        Return $size
EndFunc   ;==>size
 楼主| 发表于 2012-8-2 22:02:16 | 显示全部楼层
多谢A大...
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-21 21:46 , Processed in 0.077726 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表