找回密码
 加入
搜索
查看: 1585|回复: 4

[AU3基础] 已解决 如何给文件夹中的文件排序 要求 跟资源管理器 按名称排序的顺序一样

[复制链接]
发表于 2018-9-26 12:36:22 | 显示全部楼层 |阅读模式
本帖最后由 Mixrelax 于 2018-9-27 08:42 编辑

如何给文件夹中的文件排序
要求 跟资源管理器 按名称排序的顺序一样
用 _FileListToArray (Rec) ,FindFileNext ,Dir /on, Tree /F, _ArraySort, 冒泡排序,_ArrayMax等函数都将 10排在了最前头
听说单位数前面补0就可以解决,是了的确可以。不过有没有更好的办法 。向微软在资源管理器中给出的正确排序一样。






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2018-9-26 14:20:16 | 显示全部楼层
中午起来没事儿写着玩儿,实在没时间整理代码,思路不知道弯不弯曲,但至少实现了需求。




#include <Array.au3>
#include <File.au3>

$aFileArray = _FileListToArray(@ScriptDir & '\test')
_ArrayDisplay($aFileArray)

; 冒泡
For $i = 1 To $aFileArray[0] - 1
        For $j = 1 To $aFileArray[0] - 1
;~                 MsgBox(0, $aFileArray[$j] & '--' & $aFileArray[$j + 1], __CompareByUnicode($aFileArray[$j], $aFileArray[$j + 1]))
                If (__CompareByUnicode($aFileArray[$j], $aFileArray[$j + 1]) == -1) Then
                        Dim $tmpSwap = $aFileArray[$j]
                        $aFileArray[$j] = $aFileArray[$j + 1]
                        $aFileArray[$j + 1] = $tmpSwap
                EndIf
        Next
Next

_ArrayDisplay($aFileArray)

; 根据字符顺序做对比

Func __CompareByUnicode($sSrc, $sDest)
        Local $nSrcLength = StringLen($sSrc)
        Local $nDestLength = StringLen($sDest)
        
        ; 先对比长度是否一致
        If ($nSrcLength > $nDestLength) Then
                Return -1
        ElseIf ($nSrcLength < $nDestLength) Then
                Return 1
        Else
                ; 在对比字符顺序)
                For $i = 1 To $nSrcLength
                        Local $cSrcChar = StringMid($sSrc, $i, 1)
                        Local $cDestChar = StringMid($sDest, $i, 1)
                        
                        If (AscW($cSrcChar) > AscW($cDestChar)) Then
                                Return -1
                        ElseIf (AscW($cSrcChar) < AscW($cDestChar)) Then
                                Return 1
                        Else
                                ContinueLoop
                        EndIf
                Next
        EndIf
        
        Return 0
EndFunc


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +10 收起 理由
顽固不化 + 10 赞一个!

查看全部评分

发表于 2018-9-26 16:26:55 | 显示全部楼层
我也凑个热闹。
#include <Array.au3>
Dim $A[14] = [13,'第1067章', '第7章', '第11章', '第10章', '第9章', '第8章', '第12章', '第5章', '第6章', '第3章', '第4章', '第2章', '第1章']
For $j = 1 To UBound($A)-1
        For $i = $j+1 To UBound($A)-1
                If Number(StringRegExp($A[$i], '\d+', 1)[0]) < Number(StringRegExp($A[$j], '\d+', 1)[0]) Then
                        $temp = $A[$i]
                        $A[$i] = $A[$j]
                        $A[$j] = $temp
                EndIf
        Next
Next
_ArrayDisplay($A)

评分

参与人数 2金钱 +40 收起 理由
lpxx + 30 很给力!
nmgwddj + 10 可以的,到处都是正则

查看全部评分

发表于 2018-10-7 18:21:22 | 显示全部楼层
不要直接比较大小,第x章这个字符串掐头去尾,x-y>0的比较模式来排序
发表于 2018-10-7 18:21:38 | 显示全部楼层
具体代码自己去写吧,不难
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 15:33 , Processed in 0.074431 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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